第 6 章 将另一个路由添加到路由上下文

本教程介绍了如何在 ZooOrderApp 项目的 blueprint.xml 文件中添加第二个路由到 camel 上下文。第二个路由:

  • 直接从第一个路由的分支的终端端获取消息(valid orders)。
  • 根据客户的国家/地区对有效消息进行排序。
  • 将每个消息发送到 ZooOrderApp/target/messages 文件夹中对应的 国家 文件夹。例如,来自 Chicago zoo 的顺序被复制到 USA 文件夹。

目标

在本教程中,您将完成以下任务:

  • 重新配置现有路由以直接连接到第二个路由
  • 向 Camel 上下文添加第二个路由
  • 将第二个路由配置为直接从第一个路由的分支获取消息
  • 将基于内容的路由器添加到第二个路由
  • 将消息标头、日志记录和目标目的地添加到第二个路由基于内容的路由器的每个输出分支

先决条件

要启动此教程,您需要从以下之一生成的 ZooOrderApp 项目:

配置现有路由的端点

现有路由将所有有效的顺序发送到 target/messages/validOrders 文件夹。

在本节中,您要将现有路由的 Otherwise _elseValid 分支的端点重新配置为连接到第二个路由(您在下一节中创建)。

为与第二个路由直接连接配置现有路由:

  1. 在路由编辑器中打开 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
  2. 在 canvas 上,选择 Route_route1 容器,以在 Properties 视图中打开其属性。
  3. 向下滚动到 Shutdown Route 属性,然后选择 Default
  4. 在 canvas 上,选择终端文件 node To_Valid 以在 Properties 视图中显示其属性。
  5. Uri 字段中,删除现有文本,然后输入 direct:OrderFulfillment
  6. Id 字段中,输入 _Fulfill
注意

您可以将现有的 To_Valid 终端文件节点替换为 ComponentsDirect 组件,而是将其替换为与 repurposed To_Valid 节点相同的属性值。

要了解有关 Direct 组件的更多信息,请参阅 Apache Camel 组件参考

添加第二个路由

将另一个路由添加到路由上下文:

  1. 面板中,打开 Routing drawer,然后单击 Route ( Route icon )模式。
  2. 在 canvas 中,点击 Route_route1 容器右侧:

    tutRte2DropOnCanvas

    Route 模式成为 canvas 上的 Route_route2 容器节点。

  3. 单击 Route_route2 容器节点,以在 Properties 视图中显示其属性。将属性保留原样。
  4. 保存文件
注意

随着路由上下文变得复杂,您可能希望在处理单个路由时将路由编辑器专注于单独的路由。要做到这一点,在 Project Explorer 中,双击您希望路由编辑器在 canvas 上显示的路由;例如 Route_route2

tutProjExSwitchRtesOnCanvas

要显示 canvas 上路由上下文中的所有路由,请双击 Camel Contexts 文件夹顶部的项目的 .xml 上下文文件条目(src/main/resources/OSGI-INF/…​)。

配置选择分支来处理美国排序

在本小节中,您将 Choice 分支添加到路由,并将路由配置为发送美国订单到 新目标/消息/评估Orders/USA 文件夹。您还设置消息标头和日志文件组件。

  1. 面板中,打开 Components drawer,然后选择 Direct 组件( Direct icon )。
  2. 在 canvas 中,点 Route_route2 容器:

    Route_route2 容器会展开,以适应 Direct 组件( from_from2 节点):

    tutCBRrte2From2Add
  3. 在 canvas 上,单击 From_from2 节点,以在 Properties 视图中打开其属性。
  4. Uri 字段中,将 name (following direct:)替换为 OrderFulfillment,然后在 Id 字段中输入 _direct:OrderFulfillment

    tutCBRrte2From2Props
  5. 面板中,打开 Routing drawer,然后选择 Choice ( Choice icon )模式。
  6. 在 canvas 中,单击 From _direct:OrderFulfillment 节点。

    Route_route2 容器会展开,以适应 Choice_choice2 节点:

    tutCBRrte2Choice2Added

    Properties 视图中,保留 Choice_choice2 节点的属性。

  7. 在面板中,打开 Routing drawer,然后选择 When ( When icon )模式。
  8. 在 canvas 中,单击 Choice_choice2 节点。

    Choice_choice2 容器已展开,以适应 When_when2 节点。

    tutCBRrte2When2Added
  9. 在 canvas 上,选择 When_when2 节点,以便在 Properties 视图中打开其属性。
  10. 设置 When_when2 节点的属性,如下所示:

    • Expression 下拉列表中选择 xpath
    • 在缩进 Expression 字段中,键入 /order/customer/country = 'USA'
    • 保持 Trim enabled。
    • 在第二个 Id 字段中,键入 _when/usa

      tutCBRrte2WhenUSAprops
  11. 面板中,打开 Components drawer,然后选择 File 组件( File icon )。
  12. 在 canvas 中,点 When_when/usa 容器。

    When_when/usa 容器扩展以容纳 To_to1 节点。

  13. Properties 视图中:

    tutRte2EndptUSA
    • Uri 字段中,将 directoryName 替换为 target/messages/validOrders/USA
    • Id 字段中,键入 _US
  14. 保存文件

要设置消息标头并添加日志组件:

  1. 面板中,打开 Transformation drawer,然后选择 Set Header 模式。
  2. 在 canvas 中,点 When_when/usa 节点。

    When_when/usa 容器扩展以适应 SetHeader_setHeader3 节点:

    tutCBRrte2SetHeadUSAadd
  3. 在 canvas 上,选择 SetHeader_setHeader3 节点,以便在 Properties 视图中打开其属性。
  4. 设置节点的属性,如下所示:

    • Expression 下拉菜单中选择 constant
    • 在缩进 Expression 字段中,键入: USA
    • 保持 Trim enabled。
    • Header Name 字段中,输入: Destination
    • 在第二个 Id 字段中,键入: _setHead_usa

      tutCRErte2SetHeadusaProps
  5. 面板中,打开 Components drawer,然后选择 Log 组件( Log icon )。
  6. 在 canvas 中,点 SetHeader node。

    When_when/usa 容器扩展以适应 Log_log3 节点。

    tutCBRrte2Log3Added
  7. 在 canvas 上,选择 Log_log3 节点在 Properties 视图中打开其属性:

    tutCBRrteLog3Props
  8. Properties 视图中:

    • Message 字段中,键入 Valid order - 向美国客户发运的 aimals
    • Id 字段中,键入 _usa
    • 日志记录级别 保留原样。

      tutCBRrte2Log3usaAdded
  9. 保存文件

    Route_route2 美国分支应如下所示:

    tutUSAbranchRte2

配置其它分支来处理德国订购

在 canvas 上显示 Route_route2 时:

  1. 面板中,打开 Routing drawer,然后选择 Otherwise pattern ( Otherwise icon )。
  2. 在 canvas 中,单击 Choice_choice2 容器。

    Choice_choice2 容器扩展以适应 Otherwise_otherwise1 节点。

    tutCBRrte2WhenGERAdd
  3. 选择 Otherwise_otherwise1 节点,以便在 Properties 视图中打开其属性。
  4. Properties 视图中,为 Id 字段输入 _else/ger
  5. 在面板中,打开 Transformation drawer,然后选择 Set Header pattern ( Set Header icon )。
  6. 在 canvas 中,点 Otherwise_else/ger 节点。

    Otherwise_else/ger 容器会展开,以适应 SetHeader_setHeader3 节点。

    tutCBRrte2SetHeadGERAdd
  7. 在 canvas 上,选择 SetHeader_setHeader3 节点,以便在 Properties 视图中打开其属性。
  8. Properties 视图中:

    • Expression 下拉列表中,选择 constant
    • 在第二个 Expression 字段中,键入 Germany
    • Trim 保留为.
    • Header Name 字段中,键入 Destination
    • 在第二个 Id 字段中,键入 _setHead_ger
  9. 面板中,打开 Components drawer,然后选择 Log pattern ( Log icon )。
  10. 在 canvas 中,单击 SetHeader_setHead_ger 节点下方。

    otherwise _else/ger 容器会展开,以适应 Log_log3 节点。如果需要,将连接器错误从 Log_log3 节点拖到 SetHeader_setHead_ger 节点:

    tutCBRrte2LogGERAdd
  11. 在 canvas 上,选择 Log_log3 节点,以在 Properties 视图中打开其属性。
  12. Properties 视图中:

    • Message 字段中,键入 Valid order - 向德国客户提供imals
    • Id 字段中,键入 _ger
    • 日志记录级别 保留原样。
  13. Components drawer 中,选择一个 File pattern ( File icon ),然后点击 Log_ger 节点。

    otherwise _else/ger 容器会展开,以适应 To_to1 节点。如果需要,将连接器错误从 SetHeader_setHead_ger 节点拖到 To_to1 节点:

    tutCBRrte2GERtermFile
  14. 在 canvas 上,选择 To_to1 节点,以在 Properties 视图中打开其属性。
  15. Properties 视图中:

    • Uri 字段中,将 directoryName 替换为 target/messages/validOrders/Germany
    • Id 字段中,键入 _GER
  16. 保存文件

Route_route2 的德国分支应如下所示:

tutGERbranchRte2

验证第二个路由

canvas 上的路由应如下所示:

completed route1

ZooOrderApp 路由上下文中完成的第一个路由

已完成的 route2

ZooOrderApp 路由上下文中完成的第二个路由

在 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() &gt; 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 项目可能无法运行。

要确保更新的项目按预期工作,请按照以下步骤执行:

  1. ZooOrderApp/Camel Contexts/blueprint.xml 作为本地 Camel 上下文运行(无需测试)。
  2. 检查控制台输出的末尾。您应该看到这些行:

    tutCBRrte2Console
  3. 检查目标目标文件夹以验证路由是否已正确执行:

    1. Project Explorer 中,右键单击 ZooOrderApp,然后选择 Refresh
    2. 展开 target/messages/ 文件夹。

      message*.xml 文件应该分散在目的地,如下所示:

      图 6.1. Project Explorer 中的目标消息目的地

      消息目的地

后续步骤

在下一个教程 第 7 章 调试路由上下文 中,您将了解如何使用 Fuse 工具调试器。