第 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。
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> <camelContext id="_context1" xmlns="http://camel.apache.org/schema/blueprint"> <route id="_route1"> <from id="_from1" uri="file:src/data?noop=true"/> <choice id="_choice1"> <when id="_when1"> <xpath>/order/orderline/quantity/text() > 10</xpath> <log id="_log1" message="The quantity requested exceeds the maximum allowed - contact customer."/> <setHeader headerName="Destination" id="_setHeader1"> <constant>Invalid</constant> </setHeader> <to id="_Invalid" uri="file:target/messages/invalidOrders"/> </when> <otherwise id="_elseValid"> <log id="_log2" message="This is a valid order - OK to process."/> <setHeader headerName="Destination" id="_setHeader2"> <constant>ReadyForDispatcher</constant> </setHeader> <to id="_Valid" uri="file:target/messages/validOrders"/> </otherwise> </choice> </route> </camelContext> </blueprint>
验证 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 章 将另一个路由添加到路由上下文 中,您可以添加第二个路由来进一步处理有效顺序信息。