第 5 章 添加基于内容的路由器
本教程介绍了如何添加基于内容的路由器(CBR)并记录到路由。
CBR 根据内容将消息路由到目的地。在本教程中,根据每个消息 quantity 字段的值(按顺序数量)创建将消息路由到不同的文件夹(valid 或 invalid )的 CBR。每个顺序的最大 animals 值为 10。CBR 根据数量是否大于 10,将消息路由到不同的文件夹。例如,如果 zoo 订购五 zebras 并且只有三个 zebras 可用,则顺序将复制到无效的订购目标文件夹中。
目标
在本教程中,您将完成以下任务:
- 将基于内容的路由器添加到您的路由
配置基于内容的路由器:
- 向基于内容的路由器的每个输出分支添加日志端点
- 在每个日志端点后添加 Set Header EIP
- 将 Otherwise 分支添加到基于内容的路由器
先决条件
要启动本教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 4 章 运行路由 指南。
or
-
完成 第 2 章 设置您的环境 指南,并使用提供的
blueprintContexts/blueprint1.xml
文件替换项目的blueprint.xml
文件,如 “关于资源文件”一节 所述。
添加和配置基于内容的路由器
为您的路由添加和配置基于内容的路由器:
-
在 Project Explorer 中,双击
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
以在 Editor 视图中打开它。 -
在 Design canvas 中,选择
To_Received
节点,然后选择回收站图标来删除它。 在 Prod 中,打开 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 字段中,键入:
/order/orderline/quantity/text ()> 10
此表达式指定,只有 quantity 字段的值大于路由中的 10 个传输此路径(到 invalidOrders 文件夹)的消息。
保留每个剩余的属性。
注意Trim 选项(默认启用)从消息中删除任何前导或尾随空格和换行符。
- 保存 路由上下文文件。
点 Source 选项卡查看路由的 XML:
添加和配置日志记录
对于 ZooOrder 应用程序示例,您可以添加日志消息,以便在通过路由时跟踪 XML 消息。运行路由时,控制台 视图中会显示日志消息。
按照以下步骤将日志记录添加到 CBR 路由中:
-
在 Design 选项卡中,打开 Components drawer,再单击 Log components (
)。
在 canvas 中,点
When_when1
节点。When_when1
容器扩展以容纳Log_log1
节点:-
在 canvas 上,选择
Log_log1
节点,以在 Properties 视图中打开其属性。 在 Message 字段中,键入:
请求的数量超过允许的最大 - 联系客户。
其余的属性保留原样。
+
工具自动生成日志节点 id 值。在 Fuse Integration 视角的 Messages 视图中,工具会在 Trace Node Id 列中为消息实例插入日志节点 Id 字段的内容,在路由上启用了追踪(请参阅 第 8 章 通过路由追踪消息 指南)。在控制台中,每当路由运行时,它会将日志节点的 Message 字段的内容添加到日志数据中。
- 保存 路由上下文文件。
添加和配置消息标头
消息标头包含处理消息的信息。
添加和配置消息标头:
-
在 swig 中,打开 Transformation drawer,然后单击 Set Header (
)模式。
在 canvas 中,单击
Log_log1
节点。When_when1
容器扩展以容纳SetHeader_setHeader1
节点:在 canvas 上,选择
SetHeader_setHeader1
节点在 Properties 视图中打开其属性:-
点击 Expression 字段中的
按钮打开可用语言列表,然后选择 常数。
-
在缩进 Expression 字段中,键入
Invalid
。 -
在 Header Name 字段中,键入
Destination
。 其余的属性保留原样。
-
在 swig 中,打开 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 消息):
-
在 swig 中,打开 Routing drawer,再单击 Otherwise (
)模式。
在 canvas 中,点
Choice_choice1
容器:Choice_choice1
容器展开,以适应Otherwise_otherwise1
节点。-
在 canvas 上,选择
Otherwise_otherwise1
节点,以在 Properties 视图中打开其属性。 在 Id 字段中,将
_otherwise1
改为_elseValid
:
为其他分支配置日志记录:
-
在 swig 中,打开 Components drawer,然后单击 Log (
)组件。
在 canvas 中,点
Otherwise_elseValid
节点:Otherwise-elseValid
容器展开,以容纳Log_log2
节点。-
在 canvas 上,选择
Log_log2
节点,以在 Properties 视图中打开其属性。 在 Message 字段中,键入
This is a valid order - OK to process.
其余的属性保留原样。
- 保存 路由。
为其他分支配置消息标头:
- 在 Prod 中,打开 Transformation drawer,然后单击 Set Header 模式。
在 canvas 中,单击
Log_log2
节点。Otherwise_elseValid
容器展开,以适应SetHeader_setHeader2
节点。注意当图表被拥塞时,您可以折叠容器来释放空间。要做到这一点,选择要折叠的容器,然后点击其
按钮:
要重新打开容器,请选择它,然后点击其
按钮:
在 Design 选项卡中,联合和扩展容器不会影响路由上下文文件。它保持不变。
-
在 canvas 上,选择
SetHeader_setHeader2
节点,以在 Properties 视图中打开其属性。 -
点击 Expression 字段中的
按钮打开可用语言列表,然后选择 常量。
-
在缩进 Expression 字段中,键入
ReadyForDispatcher
。 -
在 Header Name 字段中,键入
Destination
。 其余的属性保留原样。
为有效信息指定目标文件夹:
-
在 swig 中,打开 Components drawer,然后选择 File (
)组件。
在 canvas 中,点
SetHeader_setHeader2
节点。Otherwise_elseValid
容器展开,以适应To_to1
节点。-
在 canvas 上,选择
To_to1
节点,以在 Properties 视图中打开其属性。 在 URI 字段中,将 directoryName 替换为
target/messages/validOrders
,然后在 Id 字段中键入_Valid
。保存 路由上下文文件。
已完成的基于内容的路由器应类似如下:
单击 canvas 左下方的 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 章 在路由上下文中添加另一个路由 中,您可以添加额外处理有效顺序消息的第二个路由。