第 6 章 将另一个路由添加到路由上下文
本教程介绍了如何在 ZooOrderApp
项目的 blueprint.xml
文件中添加第二个路由到 camel 上下文。第二个路由:
- 直接从第一个路由的分支的终端端获取消息(valid orders)。
- 根据客户的国家/地区对有效消息进行排序。
-
将每个消息发送到
ZooOrderApp/target/messages
文件夹中对应的国家
文件夹。例如,来自 Chicago zoo 的顺序被复制到 USA 文件夹。
目标
在本教程中,您将完成以下任务:
- 重新配置现有路由以直接连接到第二个路由
- 向 Camel 上下文添加第二个路由
- 将第二个路由配置为直接从第一个路由的分支获取消息
- 将基于内容的路由器添加到第二个路由
- 将消息标头、日志记录和目标目的地添加到第二个路由基于内容的路由器的每个输出分支
先决条件
要启动此教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 5 章 添加基于内容的路由器 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint2.xml
文件,如 “关于资源文件”一节 所述。
配置现有路由的端点
现有路由将所有有效的顺序发送到 target/messages/validOrders
文件夹。
在本节中,您要将现有路由的 Otherwise _elseValid 分支的端点重新配置为连接到第二个路由(您在下一节中创建)。
为与第二个路由直接连接配置现有路由:
-
在路由编辑器中打开
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
。 - 在 canvas 上,选择 Route_route1 容器,以在 Properties 视图中打开其属性。
- 向下滚动到 Shutdown Route 属性,然后选择 Default。
- 在 canvas 上,选择终端文件 node To_Valid 以在 Properties 视图中显示其属性。
-
在 Uri 字段中,删除现有文本,然后输入
direct:OrderFulfillment
。 -
在 Id 字段中,输入
_Fulfill
。
您可以将现有的 To_Valid
终端文件节点替换为 Components To_Valid
节点相同的属性值。
要了解有关 Direct 组件的更多信息,请参阅 Apache Camel 组件参考。
添加第二个路由
将另一个路由添加到路由上下文:
- 在 面板中,打开 Routing drawer,然后单击 Route ( )模式。
在 canvas 中,点击
Route_route1
容器右侧:Route 模式成为 canvas 上的
Route_route2
容器节点。-
单击
Route_route2
容器节点,以在 Properties 视图中显示其属性。将属性保留原样。 - 保存文件。
随着路由上下文变得复杂,您可能希望在处理单个路由时将路由编辑器专注于单独的路由。要做到这一点,在 Project Explorer 中,双击您希望路由编辑器在 canvas 上显示的路由;例如 Route_route2
:
要显示 canvas 上路由上下文中的所有路由,请双击 Camel Contexts
文件夹顶部的项目的 .xml
上下文文件条目(src/main/resources/OSGI-INF/…
)。
配置选择分支来处理美国排序
在本小节中,您将 Choice 分支添加到路由,并将路由配置为发送美国订单到 新目标/消息/评估Orders/USA
文件夹。您还设置消息标头和日志文件组件。
- 在 面板中,打开 Components drawer,然后选择 Direct 组件( )。
在 canvas 中,点
Route_route2
容器:Route_route2
容器会展开,以适应 Direct 组件(from_from2
节点):-
在 canvas 上,单击
From_from2
节点,以在 Properties 视图中打开其属性。 在 Uri 字段中,将
name
(followingdirect:
)替换为OrderFulfillment
,然后在 Id 字段中输入_direct:OrderFulfillment
。- 在 面板中,打开 Routing drawer,然后选择 Choice ( )模式。
在 canvas 中,单击
From _direct:OrderFulfillment
节点。Route_route2
容器会展开,以适应Choice_choice2
节点:在 Properties 视图中,保留
Choice_choice2
节点的属性。- 在面板中,打开 Routing drawer,然后选择 When ( )模式。
在 canvas 中,单击
Choice_choice2
节点。Choice_choice2
容器已展开,以适应When_when2
节点。-
在 canvas 上,选择
When_when2
节点,以便在 Properties 视图中打开其属性。 设置
When_when2
节点的属性,如下所示:- 从 Expression 下拉列表中选择 xpath。
-
在缩进 Expression 字段中,键入
/order/customer/country = 'USA'
。 - 保持 Trim enabled。
在第二个 Id 字段中,键入
_when/usa
- 在 面板中,打开 Components drawer,然后选择 File 组件( )。
在 canvas 中,点
When_when/usa
容器。When_when/usa
容器扩展以容纳To_to1
节点。在 Properties 视图中:
-
在 Uri 字段中,将
directoryName
替换为target/messages/validOrders/USA
。 -
在 Id 字段中,键入
_US
。
-
在 Uri 字段中,将
- 保存文件。
要设置消息标头并添加日志组件:
- 在 面板中,打开 Transformation drawer,然后选择 Set Header 模式。
在 canvas 中,点
When_when/usa
节点。When_when/usa
容器扩展以适应SetHeader_setHeader3
节点:-
在 canvas 上,选择
SetHeader_setHeader3
节点,以便在 Properties 视图中打开其属性。 设置节点的属性,如下所示:
- 在 Expression 下拉菜单中选择 constant。
-
在缩进 Expression 字段中,键入:
USA
- 保持 Trim enabled。
-
在 Header Name 字段中,输入:
Destination
在第二个 Id 字段中,键入:
_setHead_usa
- 在 面板中,打开 Components drawer,然后选择 Log 组件( )。
在 canvas 中,点
SetHeader
node。When_when/usa
容器扩展以适应Log_log3
节点。在 canvas 上,选择
Log_log3
节点在 Properties 视图中打开其属性:在 Properties 视图中:
-
在 Message 字段中,键入
Valid order - 向美国客户发运的 aimals
。 -
在 Id 字段中,键入
_usa
。 将 日志记录级别 保留原样。
-
在 Message 字段中,键入
保存文件。
Route_route2
美国分支应如下所示:
配置其它分支来处理德国订购
在 canvas 上显示 Route_route2
时:
- 在 面板中,打开 Routing drawer,然后选择 Otherwise pattern ( )。
在 canvas 中,单击
Choice_choice2
容器。Choice_choice2
容器扩展以适应Otherwise_otherwise1
节点。-
选择
Otherwise_otherwise1
节点,以便在 Properties 视图中打开其属性。 -
在 Properties 视图中,为 Id 字段输入
_else/ger
。 - 在面板中,打开 Transformation drawer,然后选择 Set Header pattern ( )。
在 canvas 中,点
Otherwise_else/ger
节点。Otherwise_else/ger
容器会展开,以适应SetHeader_setHeader3
节点。-
在 canvas 上,选择
SetHeader_setHeader3
节点,以便在 Properties 视图中打开其属性。 在 Properties 视图中:
- 从 Expression 下拉列表中,选择 constant。
-
在第二个 Expression 字段中,键入
Germany
。 - 将 Trim 保留为.
-
在 Header Name 字段中,键入
Destination
。 -
在第二个 Id 字段中,键入
_setHead_ger
。
- 在 面板中,打开 Components drawer,然后选择 Log pattern ( )。
在 canvas 中,单击
SetHeader_setHead_ger
节点下方。otherwise
_else/ger
容器会展开,以适应Log_log3
节点。如果需要,将连接器错误从Log_log3
节点拖到SetHeader_setHead_ger
节点:-
在 canvas 上,选择
Log_log3
节点,以在 Properties 视图中打开其属性。 在 Properties 视图中:
-
在 Message 字段中,键入
Valid order - 向德国客户提供imals
。 -
在 Id 字段中,键入
_ger
。 - 将 日志记录级别 保留原样。
-
在 Message 字段中,键入
在 Components drawer 中,选择一个 File pattern ( ),然后点击
Log_ger
节点。otherwise
_else/ger
容器会展开,以适应To_to1
节点。如果需要,将连接器错误从SetHeader_setHead_ger
节点拖到To_to1
节点:-
在 canvas 上,选择
To_to1
节点,以在 Properties 视图中打开其属性。 在 Properties 视图中:
-
在 Uri 字段中,将
directoryName
替换为target/messages/validOrders/Germany
-
在 Id 字段中,键入
_GER
。
-
在 Uri 字段中,将
- 保存文件。
Route_route2
的德国分支应如下所示:
验证第二个路由
canvas 上的路由应如下所示:
completed route1
已完成的 route2
在 canvas 底部的 Source 选项卡中,camelContext 元素的 XML 应该类似于 例 6.1 “基于双路由内容的路由器 XML” 所示:
例 6.1. 基于双路由内容的路由器 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" shutdownRoute="Default"> <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="_Fulfill" uri="direct:OrderFulfillment"/> </otherwise> </choice> </route> <route id="_route2"> <from id="_direct:OrderFulfillment" uri="direct:OrderFulfillment"/> <choice id="_choice2"> <when id="when/usa"> <xpath>/order/customer/country = 'USA'</xpath> <log id="_usa" message="Valid order - ship animals to USA customer"/> <setHeader headerName="Destination" id="_setHead_usa"> <constant>USA</constant> </setHeader> <to id="_US" uri="file:target/messages/validOrders/USA"/> </when> <otherwise id="_else/ger"> <log id="_ger" message="Valid order - ship animals to Germany customer"/> <setHeader headerName="Destination" id="_setHead_ger"> <constant>Germany</constant> </setHeader> <to id="_GER" uri="file:target/messages/validOrders/Germany"/> </otherwise> </choice> </route> </camelContext> </blueprint>
如果工具将属性 shutdownRoute=" "
添加到第二个路由元素(<routeid="route2">
),删除该属性。否则,ZooOrderApp
项目可能无法运行。
要确保更新的项目按预期工作,请按照以下步骤执行:
-
将
ZooOrderApp/Camel Contexts/blueprint.xml
作为本地 Camel 上下文运行(无需测试)。 检查控制台输出的末尾。您应该看到这些行:
检查目标目标文件夹以验证路由是否已正确执行:
-
在 Project Explorer 中,右键单击
ZooOrderApp
,然后选择 Refresh。 展开
target/messages/
文件夹。message*.xml
文件应该分散在目的地,如下所示:图 6.1. Project Explorer 中的目标消息目的地
-
在 Project Explorer 中,右键单击
后续步骤
在下一个教程 第 7 章 调试路由上下文 中,您将了解如何使用 Fuse 工具调试器。