第 6 章 在路由上下文中添加另一个路由
本教程介绍了如何在 ZooOrderApp
项目的 blueprint.xml
文件中添加第二个路由到 camel 上下文。第二个路由:
- 直接从第一个路由的分支终端获取消息(评估 顺序 )。
- 根据客户的国家/地区对有效消息排序。
-
将每个消息发送到
ZooOrderApp/target/messages
文件夹中的对应国家
文件夹。例如,来自 Chicago zoo 的顺序被复制到 USA 文件夹。
目标
在本教程中,您将完成以下任务:
- 重新配置现有路由以直接连接第二个路由
- 在您的 Camel 上下文中添加第二个路由
- 配置第二个路由,以直接从第一个路由的 otherwise 分支中获取消息
- 将基于内容的路由器添加到第二个路由
- 为第二个路由的内容基于内容的路由器的每个输出分支添加并配置消息标头、日志记录和目标目的地
先决条件
要启动本教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 5 章 添加基于内容的路由器 教程。
or
-
完成 第 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 上,选择终端文件节点 To_Valid 以在 Properties 视图中显示其属性。
-
在 Uri 字段中,删除现有的文本,然后输入
direct:OrderFulfillment
。 -
在 Id 字段中,输入
_Fulfill
。
您可以替换为 Components To_Valid
终端文件节点,而是使用与 repurposed To_Valid
节点相同的属性值替代。
要了解有关 直接 组件的更多信息,请参阅 Apache Camel 组件参考。
添加第二个路由
将另一个路由添加到路由上下文:
-
在 swig 中,打开 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 分支添加到路由中,并将路由配置为发送美国订购到新的 target/messages/validOrders/USA
文件夹。您还可以设置消息标头和日志文件组件。
-
在 swig 中,打开 Components drawer,然后选择 直接 组件(
)。
在 canvas 中,点
Route_route2
容器:Route_route2
容器扩展以容纳 Direct 组件(From_from2
节点):-
在 canvas 上,单击
From_from2
节点,以在 Properties 视图中打开其属性。 在 Uri 字段中,将
name
(followingdirect:
)替换为OrderFulfillment
,然后在 Id 字段中输入_direct:OrderFulfillment
。-
在 swig 中,打开 Routing drawer,然后选择 Choice (
)模式。
在 canvas 中,点
From _direct:OrderFulfillment
节点。Route_route2
容器扩展以适应Choice_choice2
节点:在 Properties 视图中,保留
Choice_choice2
节点的属性。-
在 swig 中,打开 Routing drawer,然后选择 When (
)模式。
在 canvas 中,单击
Choice_choice2
节点。Choice_choice2
容器扩展了,以适应When_when2
节点。-
在 canvas 上,选择
When_when2
节点,以在 Properties 视图中打开其属性。 设置
When_when2
节点的属性,如下所示:- 从 Expression 下拉列表中选择 xpath。
-
在缩进的 Expression 字段中,键入
/order/customer/country = 'USA'
。 - 保留 Trim 启用。
在第二个 Id 字段中,键入
_when/usa
- 在 swig 中,打开 Components drawer,然后选择 File 组件(1)。
在 canvas 中,点
When_when/usa
容器。When_when/usa
容器扩展以容纳To_to1
节点。在 Properties 视图中:
-
在 Uri 字段中,将
directoryName
替换为target/messages/validOrders/USA
。 -
在 Id 字段中,键入
_US
。
-
在 Uri 字段中,将
- 保存该文件。
要设置消息标头并添加日志组件:
- 在 Prod 中,打开 Transformation drawer,然后选择 Set Header 模式。
在 canvas 中,点
When_when/usa
节点。When_when/usa
容器扩展以容纳SetHeader_setHeader3
节点:-
在 canvas 上,选择
SetHeader_setHeader3
节点,以在 Properties 视图中打开其属性。 设置节点的属性,如下所示:
- 在 Expression 下拉菜单中选择 constant。
-
在缩进 Expression 字段中,键入:
USA
- 保留 Trim 启用。
-
在 Header Name 字段中,键入:
Destination
在第二个 Id 字段中,键入:
_setHead_usa
-
在 Prod 中,打开 Components drawer,然后选择 Log component (
)。
在 canvas 中,点
SetHeader
节点之上。When_when/usa
容器扩展以容纳Log_log3
节点。在 canvas 上,选择
Log_log3
节点以在 Properties 视图中打开其属性:在 Properties 视图中:
-
在 Message 字段中,键入
Valid order - 向美国客户提供
imals。 -
在 Id 字段中,键入
_usa
。 将 日志记录级别 保留原样。
-
在 Message 字段中,键入
保存该文件。
Route_route2
的 USA 分支应类似如下:
配置其他有效分支来处理德国订购
使用 canvas 上显示的 Route_route2
:
-
在 swig 中,打开 Routing drawer,然后选择 Otherwise pattern (
)。
在 canvas 中,单击
Choice_choice2
容器。Choice_choice2
容器展开,以适应Otherwise_otherwise1
节点。-
选择
Otherwise_otherwise1
节点,以在 Properties 视图中打开其属性。 -
在 Properties 视图中,在 Id 字段中输入
_else/ger
。 -
在 Prod 中,打开 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
。
- 在 swig 中,打开 Components drawer,然后选择 日志 模式(1)。
在 canvas 中,点
SetHeader_setHead_ger
节点下。Otherwise_else/ger
容器扩展,以适应Log_log3
节点。如果需要,将连接器错误从Log_log3
节点拖到SetHeader_setHead_ger
节点:-
在 canvas 上,选择
Log_log3
节点,以在 Properties 视图中打开其属性。 在 Properties 视图中:
-
在 Message 字段中,键入
Valid order - 向德国客户发言
。 -
在 Id 字段中,键入
_ger
。 - 将 日志记录级别 保留原样。
-
在 Message 字段中,键入
在 Components drawer 中,选择一个 File 模式(
),然后点击
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 上的路由应类似如下:
完成的 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
项目可能无法运行。
要确保您更新的项目按预期工作,请按照以下步骤执行:
-
以本地 Camel 上下文(不带测试)运行
ZooOrderApp/Camel Contexts/blueprint.xml
。 检查控制台输出的末尾。您应该看到以下行:
检查目标目标文件夹以验证路由是否已正确执行:
-
在 Project Explorer 中,右键单击
ZooOrderApp
,然后选择 Refresh。 展开
target/messages/
文件夹。message*.xml
文件应该在您的目的地中分散,如下所示:图 6.1. Project Explorer 中的目标消息目的地
-
在 Project Explorer 中,右键单击
后续步骤
在下一教程 第 7 章 调试路由上下文 中,您将了解如何使用 Fuse 工具调试器。