搜索

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

download PDF

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

CBR 根据内容将消息路由到目的地。在本教程中,根据每个消息 quantity 字段的值(按顺序数量)创建将消息路由到不同的文件夹(valid 或 invalid )的 CBR。每个顺序的最大 animals 值为 10。CBR 根据数量是否大于 10,将消息路由到不同的文件夹。例如,如果 zoo 订购五 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 节点,然后选择回收站图标来删除它。
  3. 在 Prod 中,打开 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 字段中,键入: /order/orderline/quantity/text ()> 10

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

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

    注意

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

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

    tutCBRaddedSourceV

添加和配置日志记录

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

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

  1. Design 选项卡中,打开 Components drawer,再单击 Log components ( 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. 在 swig 中,打开 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 按钮打开可用语言列表,然后选择 常数
  5. 在缩进 Expression 字段中,键入 Invalid
  6. Header Name 字段中,键入 Destination
  7. 其余的属性保留原样。

    tutSetHead1Properties2
  8. 在 swig 中,打开 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. 在 swig 中,打开 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. 在 swig 中,打开 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 to process.

    tutCBROtherwiseLog2

    其余的属性保留原样。

  5. 保存 路由。

为其他分支配置消息标头:

  1. 在 Prod 中,打开 Transformation drawer,然后单击 Set Header 模式。
  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 按钮打开可用语言列表,然后选择 常量
  5. 在缩进 Expression 字段中,键入 ReadyForDispatcher
  6. Header Name 字段中,键入 Destination
  7. 其余的属性保留原样。

    tutCBROtherwiseSetHeadProps2

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

  1. 在 swig 中,打开 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. 单击 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() &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 章 在路由上下文中添加另一个路由 中,您可以添加额外处理有效顺序消息的第二个路由。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.