第 5 章 添加基于内容的路由器
本教程介绍了如何添加基于内容的路由(CBR)和日志记录到路由。
CBR 根据其内容将消息路由到目的地。在本教程中,您创建的 CBR 根据每个消息的数量字段的值(顺序排列的数量)创建消息到不同的文件夹(valid 或无效)。每个顺序的 aimals 的最大值为 10。CBR 根据数量是否大于 10,将消息路由到不同的文件夹。例如,如果 zoo 顺序 5 zebras,且只有三个 zebras 可用,则顺序将复制到无效的顺序目标文件夹中。
目标 复制链接链接已复制到粘贴板!
在本教程中,您将完成以下任务:
- 向路由中添加基于内容的路由器
 配置基于内容的路由器:
- 向基于内容路由器的每个输出分支添加一个日志端点
 - 在每个日志端点后添加 Set Header EIP
 - 向基于内容的路由器添加 Otherwise 分支
 
先决条件 复制链接链接已复制到粘贴板!
要启动此教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 4 章 运行路由 教程。
或
- 
					完成 第 2 章 设置您的环境 教程,并将项目的 
blueprint.xml文件替换为提供的blueprintContexts/blueprint1.xml文件,如 “关于资源文件”一节 所述。 
添加和配置基于内容的路由 复制链接链接已复制到粘贴板!
为您的路由添加并配置基于内容的路由器:
- 
					在 Project Explorer 中,双击 
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml,以在 Editor 视图中打开它。 - 
					在 Design canvas 上,选择 
To_Received节点,然后选择 trash can 图标来删除它。 在 面板上,打开 Routing drawer,单击 Choice (
					 )模式,然后在 Design canvas 中点 From_from1节点。Route_route1容器会展开,以适应Choice_choice1节点。错误图标表示Choice_choice1节点需要您接下来添加的子节点。在 Routing drawer 中,点 When (
					 )模式,然后在 canvas 中点 Choice_choice1节点。Choice_choice1容器扩展以适应When_when1节点:
					 减少 When_when1节点表示必须设置一个或多个必要的属性值。注意这些工具可防止您将模式添加到 Route 容器中的无效丢弃点中。
在 canvas 上,选择
When_when1节点,以在 Properties 视图中打开其属性:- 
					点 Expression 字段中的 
					
					 按钮打开可用选项列表。
				 选择 xpath (用于 XML 查询语言),因为测试消息使用 XML 编写。
注意选择 Expression 语言后,Properties 视图会在 Expression 字段下直接显示其属性。此缩进列表中的 Id 属性设置表达式的 ID。Description 字段后的 Id 属性设置
When节点的 ID。在缩进 Expression 字段中,type:
/order/orderline/quantity/text ()> 10此表达式指定,只有 quantity 字段的值大于 10 的消息在路由(到 invalidOrders 文件夹)中传输此路径。
保留每个剩余的属性。
注意Trim 选项(默认启用)从消息中删除任何前导或尾随空格和换行符。
- 保存 路由上下文文件。
 点 Source 选项卡查看路由的 XML:
添加和配置日志 复制链接链接已复制到粘贴板!
对于 ZooOrder 应用程序示例,您可以添加日志消息,以便在通过路由时跟踪 XML 消息。运行路由时,日志消息会出现在 Console 视图中。
按照以下步骤将日志记录添加到 CBR 路由中:
- 
					在 Design 选项卡中,打开 Components drawer,再点 Log 组件( 
					
					 )。
				 在 canvas 中,单击
When_when1节点。When_when1容器扩展以容纳Log_log1节点:- 
					在 canvas 上,选择 
Log_log1节点,以在 Properties 视图中打开其属性。 在 Message 字段中,键入:
请求的数量超过允许的最大值 - 联系客户。
将剩余的属性保留原样。
+
工具自动生成日志节点 id 值。在 Fuse Integration 视角的 Messages 视图中,工具会在 Trace Node Id 列中插入日志节点的 Id 字段的内容,以便在路由上启用追踪时(请参阅 第 8 章 通过路由追踪消息 教程)。在控制台中,每当路由运行时,它会将日志节点的 Message 字段的内容添加到日志数据中。
- 保存 路由上下文文件。
 
添加和配置消息标头 复制链接链接已复制到粘贴板!
消息标头包含处理消息的信息。
添加和配置消息标头:
- 
					在面板中,打开 Transformation drawer,然后单击 Set Header ( 
					
					 )模式。
				 在 canvas 中,单击
Log_log1节点。When_when1容器展开,以适应SetHeader_setHeader1节点:在 canvas 中,选择
SetHeader_setHeader1节点,以便在 Properties 视图中打开其属性:- 
					点 Expression 字段中的 
					
					 按钮打开可用语言列表,然后选择 constant。
				 - 
					在缩进 Expression 字段中,键入 
Invalid。 - 
					在 Header Name 字段中,键入 
Destination。 将剩余的属性保留原样。
- 
					在 面板中,打开 Components drawer,然后单击 File ( 
					
					 )组件。
				 在 canvas 中,点
SetHeader_setHeader1节点。When_when1容器展开,以适应To_to1节点。在 canvas 上,选择
To_to1节点,以便在 Properties 视图中打开其属性:在 Details 选项卡中,将 directoryName 替换为 Uri 字段中的
target/messages/invalidOrders,然后在 Id 字段中输入_Invalid:- 保存 路由上下文文件。
 点 Source 选项卡查看路由的 XML:
添加并配置分支来处理有效顺序 复制链接链接已复制到粘贴板!
目前,CBR 处理包含无效顺序的消息(数量值大于 10 的顺序)。
要添加并配置您的路由分支来处理有效顺序(即,任何与 When_when1 节点设置的 XPath 表达式不匹配的 XML 消息):
- 
					在面板中,打开 Routing drawer,再点 Otherwise ( 
					
					 )模式。
				 在 canvas 中,点
Choice_choice1容器:Choice_choice1容器扩展,以适应Otherwise_otherwise1节点。- 
					在 canvas 上,选择 
Otherwise_otherwise1节点,以便在 Properties 视图中打开其属性。 在 Id 字段中,将
_otherwise1更改为_elseValid:
为其他分支配置日志记录:
- 
					在 面板中,打开 Components drawer,然后单击 Log ( 
					
					 )组件。
				 在 canvas 中,点
Otherwise_elseValid节点:otherwise
-elseValid容器展开,以适应Log_log2节点。- 
					在 canvas 上,选择 
Log_log2节点,以便在 Properties 视图中打开其属性。 在 Message 字段中,键入
This is a valid order - OK process。将剩余的属性保留原样。
- 保存 路由。
 
为 otherwise 分支配置消息标头:
- 在 面板中,打开 Transformation drawer,然后单击 Set Header pattern。
 在 canvas 中,单击
Log_log2节点。Otherwise_elseValid容器展开,以适应SetHeader_setHeader2节点。注意当图表被嵌套时,您可以折叠容器来释放空间。要做到这一点,选择要折叠的容器,然后点击其
						 按钮:
					要重新打开容器,请选择容器,然后点击其
						 按钮:
					在 Design 选项卡中合并和扩展容器不会影响路由上下文文件。它保持不变。
- 
					在 canvas 上,选择 
SetHeader_setHeader2节点,以便在 Properties 视图中打开其属性。 - 
					点 Expression 字段中的 
					
					 按钮打开可用语言列表,然后选择 constant。
				 - 
					在缩进 Expression 字段中,键入 
ReadyForDispatcher。 - 
					在 Header Name 字段中,键入 
Destination。 将剩余的属性保留原样。
为有效信息指定目标文件夹:
- 
					在 面板中,打开 Components drawer,然后选择 File ( 
					
					 )组件。
				 在 canvas 中,点
SetHeader_setHeader2节点。Otherwise_elseValid容器展开,以适应To_to1节点。- 
					在 canvas 上,选择 
To_to1节点,以在 Properties 视图中打开其属性。 在 URI 字段中,将 directoryName 替换为
target/messages/validOrders,然后在 Id 字段中,键入_Valid。保存 路由上下文文件。
已完成的基于内容的路由器应如下所示:
点底部的 Source 选项卡,显示该路由的 XML。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
验证 CBR 复制链接链接已复制到粘贴板!
您可以按照 “运行路由”一节 教程所述运行新路由,并查看 Console 视图来查看日志消息。
运行它后,要验证路由是否已正确执行,请检查 Project Explorer 中的目标目标文件夹:
- 
					选择 
ZooOrderApp。 - 右键单击它以打开上下文菜单,然后选择 Refresh。
 在项目根节点(
ZooOrderApp)下,找到target/messages/文件夹并展开它。检查
target/messages/invalidOrders文件夹是否包含message1.xml和message3.xml。在这些消息中,
quantity元素的值超过 10。检查
target/messages/validOrders文件夹是否包含包含有效顺序的四个消息文件:- 
							
message2.xml - 
							
message4.xml - 
							
message5.xml message6.xml在这些消息中,
quantity元素的值小于或等于 10。注意要查看消息内容,请双击每个消息,以便在路由编辑器的 XML 编辑器中打开它。
- 
							
 
后续步骤 复制链接链接已复制到粘贴板!
在下一个教程 第 6 章 将另一个路由添加到路由上下文 中,您可以添加第二个路由来进一步处理有效顺序信息。