第 5 章 添加基于内容的路由器

本教程介绍了如何添加基于内容的路由(CBR)和日志记录到路由。

CBR 根据其内容将消息路由到目的地。在本教程中,您创建的 CBR 根据每个消息的数量字段的值(顺序排列的数量)创建消息到不同的文件夹(valid 或无效)。每个顺序的 aimals 的最大值为 10。CBR 根据数量是否大于 10,将消息路由到不同的文件夹。例如,如果 zoo 顺序 5 zebras,且只有三个 zebras 可用,则顺序将复制到无效的顺序目标文件夹中。

目标

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

  • 向路由中添加基于内容的路由器
  • 配置基于内容的路由器:

    • 向基于内容路由器的每个输出分支添加一个日志端点
    • 在每个日志端点后添加 Set Header EIP
    • 向基于内容的路由器添加 Otherwise 分支

先决条件

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

添加和配置基于内容的路由

为您的路由添加并配置基于内容的路由器:

  1. Project Explorer 中,双击 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml,以在 Editor 视图中打开它。
  2. Design canvas 上,选择 To_Received 节点,然后选择 trash can 图标来删除它。
  3. 面板上,打开 Routing drawer,单击 Choice ( Choice icon )模式,然后在 Design canvas 中点 From_from1 节点。

    tutCBRaddChoice1

    Route_route1 容器会展开,以适应 Choice_choice1 节点。错误图标表示 Choice_choice1 节点需要您接下来添加的子节点。

  4. Routing drawer 中,点 When ( When icon )模式,然后在 canvas 中点 Choice_choice1 节点。

    Choice_choice1 容器扩展以适应 When_when1 节点:

    tutCBRaddWhen1

    warning icon 减少 When_when1 节点表示必须设置一个或多个必要的属性值。

    注意

    这些工具可防止您将模式添加到 Route 容器中的无效丢弃点中。

  5. 在 canvas 上,选择 When_when1 节点,以在 Properties 视图中打开其属性:

    tutCBRWhen1OpenProps
  6. Expression 字段中的 drop-down menu icon 按钮打开可用选项列表。
  7. 选择 xpath (用于 XML 查询语言),因为测试消息使用 XML 编写。

    注意

    选择 Expression 语言后,Properties 视图会在 Expression 字段下直接显示其属性。此缩进列表中的 Id 属性设置表达式的 ID。Description 字段后的 Id 属性设置 When 节点的 ID。

  8. 在缩进 Expression 字段中,type: /order/orderline/quantity/text ()> 10

    此表达式指定,只有 quantity 字段的值大于 10 的消息在路由(到 invalidOrders 文件夹)中传输此路径。

  9. 保留每个剩余的属性。

    注意

    Trim 选项(默认启用)从消息中删除任何前导或尾随空格和换行符。

    tutCBRWhen1Props
  10. 保存 路由上下文文件。
  11. Source 选项卡查看路由的 XML:

    tutCBRaddedSourceV

添加和配置日志

对于 ZooOrder 应用程序示例,您可以添加日志消息,以便在通过路由时跟踪 XML 消息。运行路由时,日志消息会出现在 Console 视图中。

按照以下步骤将日志记录添加到 CBR 路由中:

  1. Design 选项卡中,打开 Components drawer,再点 Log 组件( Log icon )。
  2. 在 canvas 中,单击 When_when1 节点。

    When_when1 容器扩展以容纳 Log_log1 节点:

    tutCBRlog1Added
  3. 在 canvas 上,选择 Log_log1 节点,以在 Properties 视图中打开其属性。
  4. Message 字段中,键入: 请求的数量超过允许的最大值 - 联系客户。

    tutCBRlog1Properties

将剩余的属性保留原样。

+

注意

工具自动生成日志节点 id 值。在 Fuse Integration 视角的 Messages 视图中,工具会在 Trace Node Id 列中插入日志节点的 Id 字段的内容,以便在路由上启用追踪时(请参阅 第 8 章 通过路由追踪消息 教程)。在控制台中,每当路由运行时,它会将日志节点的 Message 字段的内容添加到日志数据中。

  1. 保存 路由上下文文件。

添加和配置消息标头

消息标头包含处理消息的信息。

添加和配置消息标头:

  1. 在面板中,打开 Transformation drawer,然后单击 Set Header ( Set Header icon )模式。
  2. 在 canvas 中,单击 Log_log1 节点。

    When_when1 容器展开,以适应 SetHeader_setHeader1 节点:

    tutSetHead1Added
  3. 在 canvas 中,选择 SetHeader_setHeader1 节点,以便在 Properties 视图中打开其属性:

    tutSetHeadPropEdNew
  4. Expression 字段中的 drop-down menu icon 按钮打开可用语言列表,然后选择 constant
  5. 在缩进 Expression 字段中,键入 Invalid
  6. Header Name 字段中,键入 Destination
  7. 将剩余的属性保留原样。

    tutSetHead1Properties2
  8. 面板中,打开 Components drawer,然后单击 File ( File icon )组件。
  9. 在 canvas 中,点 SetHeader_setHeader1 节点。

    When_when1 容器展开,以适应 To_to1 节点。

    tutCBRWhen1TargetFile
  10. 在 canvas 上,选择 To_to1 节点,以便在 Properties 视图中打开其属性:

    tutCBRNewTargetFileProps1
  11. Details 选项卡中,将 directoryName 替换为 Uri 字段中的 target/messages/invalidOrders,然后在 Id 字段中输入 _Invalid

    tutCBRNewTargetFileProps2
  12. 保存 路由上下文文件。
  13. Source 选项卡查看路由的 XML:

    tutCBRLogHeaderSourceV

添加并配置分支来处理有效顺序

目前,CBR 处理包含无效顺序的消息(数量值大于 10 的顺序)。

要添加并配置您的路由分支来处理有效顺序(即,任何与 When_when1 节点设置的 XPath 表达式不匹配的 XML 消息):

  1. 在面板中,打开 Routing drawer,再点 Otherwise ( Otherwise icon )模式。
  2. 在 canvas 中,点 Choice_choice1 容器:

    tutCBRaddOtherwise

    Choice_choice1 容器扩展,以适应 Otherwise_otherwise1 节点。

  3. 在 canvas 上,选择 Otherwise_otherwise1 节点,以便在 Properties 视图中打开其属性。
  4. Id 字段中,将 _otherwise1 更改为 _elseValid

    tutCBROtherwiseProps

为其他分支配置日志记录:

  1. 面板中,打开 Components drawer,然后单击 Log ( Log icon )组件。
  2. 在 canvas 中,点 Otherwise_elseValid 节点:

    otherwise -elseValid 容器展开,以适应 Log_log2 节点。

    tutCBROtherwiseLogAdd
  3. 在 canvas 上,选择 Log_log2 节点,以便在 Properties 视图中打开其属性。
  4. Message 字段中,键入 This is a valid order - OK process。

    tutCBROtherwiseLog2

    将剩余的属性保留原样。

  5. 保存 路由。

为 otherwise 分支配置消息标头:

  1. 面板中,打开 Transformation drawer,然后单击 Set Header pattern。
  2. 在 canvas 中,单击 Log_log2 节点。

    Otherwise_elseValid 容器展开,以适应 SetHeader_setHeader2 节点。

    tutCBRSetHead2Add
    注意

    当图表被嵌套时,您可以折叠容器来释放空间。要做到这一点,选择要折叠的容器,然后点击其 collapse icon 按钮:

    tutCBRcollapseWhen1Container

    要重新打开容器,请选择容器,然后点击其 expand icon 按钮:

    tutCBRexpandWhen1Container

    Design 选项卡中合并和扩展容器不会影响路由上下文文件。它保持不变。

  3. 在 canvas 上,选择 SetHeader_setHeader2 节点,以便在 Properties 视图中打开其属性。
  4. Expression 字段中的 drop-down menu icon 按钮打开可用语言列表,然后选择 constant
  5. 在缩进 Expression 字段中,键入 ReadyForDispatcher
  6. Header Name 字段中,键入 Destination
  7. 将剩余的属性保留原样。

    tutCBROtherwiseSetHeadProps2

为有效信息指定目标文件夹:

  1. 面板中,打开 Components drawer,然后选择 File ( File icon )组件。
  2. 在 canvas 中,点 SetHeader_setHeader2 节点。

    Otherwise_elseValid 容器展开,以适应 To_to1 节点。

    tutCBROtherwiseFileAdd
  3. 在 canvas 上,选择 To_to1 节点,以在 Properties 视图中打开其属性。
  4. URI 字段中,将 directoryName 替换为 target/messages/validOrders,然后在 Id 字段中,键入 _Valid

    tutCBROtherwiseTargFile2
  5. 保存 路由上下文文件。

    已完成的基于内容的路由器应如下所示:

    tutCBRfinalDesignV
  6. 点底部的 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() &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="_Valid" uri="file:target/messages/validOrders"/>
                    </otherwise>
                </choice>
            </route>
        </camelContext>
    </blueprint>

验证 CBR

您可以按照 “运行路由”一节 教程所述运行新路由,并查看 Console 视图来查看日志消息。

运行它后,要验证路由是否已正确执行,请检查 Project Explorer 中的目标目标文件夹:

  1. 选择 ZooOrderApp
  2. 右键单击它以打开上下文菜单,然后选择 Refresh
  3. 在项目根节点(ZooOrderApp)下,找到 target/messages/ 文件夹并展开它。

    消息目的地
  4. 检查 target/messages/invalidOrders 文件夹是否包含 message1.xmlmessage3.xml

    在这些消息中,quantity 元素的值超过 10。

  5. 检查 target/messages/validOrders 文件夹是否包含包含有效顺序的四个消息文件:

    • message2.xml
    • message4.xml
    • message5.xml
    • message6.xml

      在这些消息中,quantity 元素的值小于或等于 10。

      注意

      要查看消息内容,请双击每个消息,以便在路由编辑器的 XML 编辑器中打开它。

后续步骤

在下一个教程 第 6 章 将另一个路由添加到路由上下文 中,您可以添加第二个路由来进一步处理有效顺序信息。