工具 Tutorials


Red Hat Fuse 7.13

如何在 CodeReady Studio 中使用 Fuse 工具的示例

Red Hat Fuse Documentation Team

摘要

本指南包含许多简单的教程,它们演示了如何使用红帽 Fuse 工具提供的工具来开发和测试应用程序。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。这些更改将在即将发行的几个发行本中逐渐实施。详情请查看我们的 CTO Chris Wright 信息

第 1 章 关于 Fuse 工具 Tutorials

红帽 Fuse 工具指南为使用 Fuse 工具开发、运行、测试和部署 Apache Camel 应用程序提供实践介绍。

先决条件

开始前,您应该熟悉以下软件:

Fuse 工具指南概述

以下是教程的摘要以及您在每个教程中的内容:

有关 Fuse 工具功能的更多详细信息,请参阅 工具用户指南

关于示例应用程序

您在 Fuse 工具指南中构建的示例应用程序模拟一个简单的订购应用程序,以便 zoos 订购 animals。提供了示例 XML 消息 - 每个 XML 消息包括客户信息(zoo 的名称、城市和国家/地区)和订单信息(请求的类型和数量,以及允许的最大异常数)。

使用 Fuse 工具,您可以创建一个获取传入示例消息的蓝图项目,根据其内容(评估与无效顺序)过滤它们,然后进一步按 zoo 的位置(计数)对有效顺序进行排序。在后面的教程中,您将使用示例应用调试路由上下文,通过路由跟踪消息,测试使用 JUnit 的路由,最后发布 Fuse 项目。

关于资源文件

每个教程都基于上一个教程。一个教程生成的代码是下一教程的起点,以便您可以按顺序完成教程。另外,在完成第一个教程后,您可以使用其中一个提供的上下文文件作为起点来按顺序执行任何其他教程。

教程依赖于 Fuse-tooling-tutorials-jbds-10.3.zip 文件中提供的资源文件,位于 此处。这个 zip 文件包含两个文件夹:

messages
此文件夹包含六个消息文件,名为 message1.xml,message2.xml, …​ , message6.xml。在第一个教程 第 2 章 设置您的环境 中,您要创建保存这些消息文件的目录,同时查看其内容。所有教程都需要这些消息文件。
blueprintContexts

这个文件夹包含三个路由上下文文件:

第 2 章 设置您的环境

本教程介绍了创建 Fuse 集成项目的过程。该项目包含初始路由和默认的 CamelContext。路由是消息传输的处理器链。CamelContext 是一个单一路由规则基础,用于定义配置路由的上下文,并在端点(消息源和目标)之间消息交换过程中使用的策略。

您必须先完成本教程,然后才能遵循任何其他教程。

目标

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

  • 创建 Fuse 集成项目
  • 为您的项目下载测试消息(XML 文件)
  • 查看测试信息

开始前

在设置 Fuse 集成项目前,您必须使用 Fuse 工具安装 Red Hat CodeReady Studio。有关如何安装 CodeReady Studio 的信息,请访问红帽客户门户 以获取您的平台安装指南。

在遵循 第 10 章 将项目发布到红帽 Fuse 指南中的步骤前,您必须安装 Java 8。

创建 Fuse 集成项目

  1. 打开 Red Hat CodeReady Studio。

    首次启动 CodeReady Studio 时,它会在 JBoss 透视图中打开:

    JBoss 在启动时视角

    否则,它会在之前 CodeReady Studio 会话中使用的视角中打开。

  2. 在菜单中,选择 FileNewFuse Integration Project 以打开 New Fuse Integration Project 向导:

    New Project 向导
  3. Project Name 字段中,输入 ZooOrderApp

    保留 Use default 工作区位置 选项被选择。

  4. Next 以打开 Select a Target Runtime 页面:

    选择 Target Runtime 页面
  5. 为部署平台选择独立
  6. 选择 Karaf/Fuse on Karaf 并接受为运行时 选择的 None

    注意

    您稍后会在 第 10 章 将项目发布到红帽 Fuse 指南中添加运行时。

  7. 接受默认的 Apache Camel 版本

    选择 Target Runtime 页已填写
  8. Next 以打开 Advanced Project Setup 页面,然后选择 Empty - Blueprint DSL 模板:

    高级项目设置
  9. Finish

    Fuse 工具开始从 Maven 存储库下载 - 所有需要构建项目的文件,然后将新项目添加到 Project Explorer 视图。

    如果 CodeReady Studio 尚未显示 Fuse Integration 视角,它会询问您现在是否要切换到它:

    tutSwitchToFIP
  10. 单击 Yes

    新的 ZooOrderApp 项目在 Fuse Integration 视角中打开:

    tutEmptyProjectOpen

    ZooOrderApp 项目包含创建和运行路由所需的所有文件,包括:

    • ZooOrderApp/pom.xml HEKETI-wagonA Maven 项目文件。

      生成的 blueprint.xml 和 pom.xml 文件
    • ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml wagon-wagonA Blueprint XML 文件,其中包含 Camel 路由上下文和一个初始空路由。
  11. 要查看初始路由上下文,请在 Editor 视图中打开 blueprint.xml 文件,然后点 Source 选项卡。

    tutRouteSource

设置组件标签以显示 ID 值

为确保在 Design canvas 上的模式和组件的标签与工具 Tutorials 中显示的标签相同:

  1. 打开 Editor 首选项页面:

    • 在 Linux 和 Windows 机器上,选择 WindowsPreferencesFuse ToolingEditor
    • 在 OS X 上,选择 CodeReady StudioPreferencesFuse ToolingEditor
  2. 检查 所有组件标签的 Use ID 值

    编辑器首选项 - 使用 ID 值选项
  3. 单击应用并关闭

下载项目的测试消息

提供了 XML 消息文件示例,以便您可以在使用工具 Tutorials 时测试 ZooOrderApp 项目。消息包含 zoo animals 的顺序信息。例如,为 Chicago zoo 的顺序是五个 wombats。

将提供的测试信息(XML 文件)下载到项目中:

  1. 在 CodeReady Studio Project Explorer 视图中,创建一个文件夹来包含测试消息:

    1. 右键单击 ZooOrderApp/src 文件夹,然后选择 NewFolderNew Folder 向导将打开。
    2. 对于 文件夹名称,请键入 data
    3. Finish
  2. 点击此处 打开 Web 浏览器,进入提供的工具工具 Tutorial 资源 Fuse-tooling-tutorials-jbds-10.3.zip 文件的位置。

    Fuse-tooling-tutorials-jbds-10.3.zip 文件下载到 ZooOrderApp 项目工作区外部的便捷位置,然后将其解压缩。它包含两个文件夹,如 第 1 章 关于 Fuse 工具 Tutorials 所述。

  3. messages 文件夹,将六个 XML 文件复制到 ZooOrderApp 项目的 src/data 文件夹。

    项目数据文件夹中的消息文件
    注意

    您可以在 XML 文件中安全地忽略 Warning icon

查看测试信息

每个 XML 消息文件都包含来自 zoo (客户)数量的顺序。例如,'message1.xml' 文件包含来自 Brooklyn Zoo for 12 wombats 的顺序。

您可以在 Editor 视图中打开任何消息 XML 文件,以检查内容。

  1. Project Explorer 视图中,右键单击消息文件。
  2. 在弹出菜单中选择 Open
  3. Source 选项卡。

    XML 文件在 Editor 视图中打开。

    例如,message1.xml 文件的内容显示来自 Bronx Zoo 为 12 个 wombats 的顺序:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <order>
      <customer>
        <name>Bronx Zoo</name>
        <city>Bronx NY</city>
        <country>USA</country>
      </customer>
      <orderline>
        <animal>wombat</animal>
        <quantity>12</quantity>
      </orderline>
    </order>
注意

您可以在新创建的 message1.xml 文件的第一行中安全地忽略 Warning icon ,这建议您没有文档引用的 grammar 约束(DTD 或 XML Schema)。

下表提供了所有六个消息文件的内容概述:

表 2.1. 提供测试信息
msg#<name><City><country><animal><quantity>

1

Bronx Zoo

Bronx NY

美国

Wombat

12

2

SAN Diego Zoo

SAN Diego CA

美国

giraffe

3

3

SEA Life Centre

Munich

德国

penguin

15

4

Berlin Zoo

Berlin

德国

emu

6

5

Philadelphia Zoo

Philapelphia PA

美国

giraffe

2

6

st Louis Zoo

st Loius MO

美国

penguin

10

后续步骤

现在,您已设置了 CodeReady Studio 项目,您可以继续使用 第 3 章 定义路由 指南来定义处理 XML 信息的路由。

第 3 章 定义路由

本教程介绍了在路由中添加和配置端点的步骤。端点定义源和接收器(sink),用于通过路由传输的信息。对于 ZooOrderApp 项目,启动(源)端点是包含 XML 消息文件的文件夹。sink (finishing)端点是您在项目中指定的另一个文件夹。

目标

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

  • 向路由添加源和接收器端点
  • 配置端点
  • 连接端点

开始前

在开始本教程前:

  1. 您必须设置工作区环境,如 第 2 章 设置您的环境 教程中所述。
  2. 在 CodeReady Studio 中,在 Editor 视图中打开 ZooOrderApp 项目的 /src/main/resources/OSGI-INF/blueprint/blueprint.xml 文件。
  3. 如果需要,请单击 Editor 视图底部的 Design 选项卡,以查看初始路由的图形显示,标记为 Route_route1

配置源端点

按照以下步骤将 src/data 文件夹配置为路由的源端点:

  1. 将文件组件组件 File icon 拖到 canvas 中,并将它放到 Route_route1 容器节点中。

    File 组件会更改为 Route_route1 容器节点内的 From _from1 节点。

  2. 在 canvas 上,选择 From _from1 节点。

    Properties 视图位于 canvas 下,显示节点的属性字段进行编辑。

  3. 要为消息文件指定源目录,在 Properties 视图中点 Advanced 选项卡:

    FileSysCompProps1Tut
  4. Directory Name 字段中,输入 src/data

    FileSystemCompPropsTut

    路径 src/data 相对于项目的目录。

  5. Consumer 选项卡中,点 Noop 选项来启用 Noop 选项。

    Noop 选项可防止 消息 Serial.xml 文件从 src/data 文件夹中删除,并启用 idempotency 来确保每个 message#.xml 文件只消耗一次。

  6. 选择 Details 选项卡,以打开文件节点的 Details 页面。

    请注意,工具会自动使用您在 Advanced 选项卡上配置的 Directory NameNoop 属性填充 Uri 字段。它还使用自动生成的 ID (_from1)填充 Id 字段:

    FileSystemCompPropsTut2
    注意

    工具前缀使用下划线(_)自动生成 ID 值。您可以选择更改 ID 值。underscore 前缀不是一个要求。

    将自动生成的 Id 保留为原样。

  7. 选择 FileSave 保存路由。

配置接收器端点

添加并配置路由的 sink (目标)端点:

  1. 另一个文件 组件从 PrometheusRule 的Components drawer 拖放,并将它放到 Route_route1 容器节点上。

    File 组件会更改为 Route_route1 容器节点内的 To_to1 节点。

  2. 在 canvas 上,选择 To_to1 节点。

    Properties 视图位于 canvas 下,显示节点的属性字段进行编辑。

  3. Details 标签页中:

    1. Uri 字段中,键入 file:target/messages/received
    2. Id 字段中,键入 _Received

      FilesysTargetCompPropsTut
      注意

      该工具将在运行时创建 target/messages/received 文件夹。

  4. Route_route1 容器中,选择 From _from1 节点,并将其连接器箭头( connector arrow icon )拖到 To_Received 节点上,然后释放它:

    CompletedRoute1
    注意

    这两个文件节点已连接并一致,根据路由编辑器的布局首选项设置。选择是 Down (默认)和 Right

    要访问路由编辑器的布局首选项选项:

    • 在 Linux 和 Windows 机器上,选择 WindowsPreferencesFuse ToolingEditor选择图编辑器的布局方向
    • 在 OS X 上,选择 CodeReady StudioPreferencesFuse ToolingEditor选择图表编辑器的布局方向
    注意

    如果在关闭项目前没有连接节点,工具会在重新打开时自动连接它们。

  5. 保存 路由。
  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"/>
                <to id="_Received" uri="file:target/messages/received"/>
            </route>
        </camelContext>
    </blueprint>

后续步骤

现在,您在路由中添加和配置了端点,您可以运行路由,如 第 4 章 运行路由 指南所述。

第 4 章 运行路由

本教程介绍了运行路由的过程,以验证路由是否已正确将信息从源端点传输到接收器端点。

目标

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

  • 将路由作为本地 Camel 上下文运行(不带测试,因为您尚未设置测试)
  • 通过路由发送消息
  • 检查 sink 端点收到的消息,以确保路由正确处理测试信息

先决条件

要启动本教程,您需要如下 ZooOrderApp 项目:

  1. 完成 第 2 章 设置您的环境 指南。
  2. 下面是其中之一:

运行路由

运行路由:

  1. 打开 ZooOrderApp 项目。
  2. Project Explorer 中,选择 ZooOrderApp/Camel Contexts/blueprint.xml

    tutRunCBRrouteCamContext
  3. 右键单击 blueprint.xml,然后选择 Run AsLocal Camel Context (无需测试)。

    注意

    如果您选择 Local Camel Context,该工具会自动尝试针对提供的 JUnit 测试运行路由上下文。由于 JUnit 测试不存在,因此工具将恢复到在没有测试的情况下运行路由上下文。在 第 9 章 使用 JUnit 测试路由 教程中,您可以创建一个 JUnit 测试案例来测试 ZooOrderApp 项目。

    Console 面板将打开,以显示反映项目执行进度的日志消息。开始时,Maven 下载更新本地 Maven 存储库所需的资源。Maven 下载过程可能需要几分钟时间。

  4. 等待消息(与以下内容类似)在输出末尾出现:这些消息表示路由成功执行:

    ...
    [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO  Route: _route1 started and consuming from:Endpoint[file://src/data?noop=true]
    [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO  Total 1 routes, of which 1 are started.
    [Blueprint Event Dispatcher: 1]BlueprintCamelContext INFO  Apache Camel 2.21.0.redhat-3 (CamelContext: ...) started in 0.163 seconds
    [Blueprint Event Dispatcher: 1] BlueprintCamelContext INFO  Apache Camel 2.21.0.redhat-3 (CamelContext: ...) started in 0.918 seconds
  5. 要关闭路由,请点击 Console 视图顶部的 console’s shutdown button

验证路由

要验证路由是否已正确执行,您可以检查消息 XML 文件是否从源文件夹(src/data)复制到目标文件夹(target/messages/received)。

  1. Project Explorer 中,选择 ZooOrderApp
  2. 右键单击,然后选择 Refresh
  3. Project Explorer 中,找到 target/messages/ 文件夹并展开,以验证 target/messages/received 文件夹是否包含六个消息文件 message1.xmlmessage6.xml

    消息目的地
  4. 双击 message1.xml 在路由编辑器的 Design 选项卡中打开它,然后选择 Source 选项卡来查看 XML 代码:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <order>
      <customer>
        <name>Bronx Zoo</name>
        <city>Bronx NY</city>
        <country>USA</country>
      </customer>
      <orderline>
        <animal>wombat</animal>
        <quantity>12</quantity>
      </orderline>
    </order>

后续步骤

第 5 章 添加基于内容的路由器 教程中,您添加一个基于 Content-Based Router,它使用消息的内容来确定其目的地。

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

本教程介绍了如何添加基于内容的路由器(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 章 在路由上下文中添加另一个路由 中,您可以添加额外处理有效顺序消息的第二个路由。

第 6 章 在路由上下文中添加另一个路由

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

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

目标

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

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

先决条件

要启动本教程,您需要从以下之一生成的 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 上,选择终端文件节点 To_Valid 以在 Properties 视图中显示其属性。
  5. Uri 字段中,删除现有的文本,然后输入 direct:OrderFulfillment
  6. Id 字段中,输入 _Fulfill
注意

您可以替换为 ComponentsDirect 组件,而不是重新处理现有的 To_Valid 终端文件节点,而是使用与 repurposed To_Valid 节点相同的属性值替代。

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

添加第二个路由

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

  1. 在 swig 中,打开 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 分支添加到路由中,并将路由配置为发送美国订购到新的 target/messages/validOrders/USA 文件夹。您还可以设置消息标头和日志文件组件。

  1. 在 swig 中,打开 Components drawer,然后选择 直接 组件( 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. 在 swig 中,打开 Routing drawer,然后选择 Choice ( Choice icon )模式。
  6. 在 canvas 中,点 From _direct:OrderFulfillment 节点。

    Route_route2 容器扩展以适应 Choice_choice2 节点:

    tutCBRrte2Choice2Added

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

  7. 在 swig 中,打开 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 启用。
    • 在第二个 Id 字段中,键入 _when/usa

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

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

  13. Properties 视图中:

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

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

  1. 在 Prod 中,打开 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 启用。
    • Header Name 字段中,键入: Destination
    • 在第二个 Id 字段中,键入: _setHead_usa

      tutCRErte2SetHeadusaProps
  5. 在 Prod 中,打开 Components drawer,然后选择 Log component ( Log icon )。
  6. 在 canvas 中,点 SetHeader 节点之上。

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

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

    tutCBRrteLog3Props
  8. Properties 视图中:

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

      tutCBRrte2Log3usaAdded
  9. 保存该文件

    Route_route2 的 USA 分支应类似如下:

    tutUSAbranchRte2

配置其他有效分支来处理德国订购

使用 canvas 上显示的 Route_route2

  1. 在 swig 中,打开 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. 在 Prod 中,打开 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. swig 中,打开 Components drawer,然后选择 日志 模式(1)。
  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 - 向德国客户发言
    • Id 字段中,键入 _ger
    • 日志记录级别 保留原样。
  13. Components drawer 中,选择一个 File 模式( 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 上的路由应类似如下:

完成的 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. 以本地 Camel 上下文(不带测试)运行 ZooOrderApp/Camel Contexts/blueprint.xml
  2. 检查控制台输出的末尾。您应该看到以下行:

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

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

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

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

      消息目的地

后续步骤

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

第 7 章 调试路由上下文

本教程介绍了如何使用 Camel 调试器查找本地运行路由上下文的逻辑错误。

目标

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

  • 在两个路由中感兴趣的节点上设置断点
  • 在 Debug 透视图中,逐步浏览路由并检查消息变量的值
  • 再次逐步浏览路由,更改消息变量的值并观察其效果

先决条件

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

设置断点

在 Debugger 中,您可以设置条件和无条件断点。在本教程中,您只设置无条件断点。要了解如何设置条件断点(在调试会话过程中满足特定条件时触发),请参阅 工具用户指南

设置无条件断点:

  1. 如有必要,在路由编辑器中打开 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
  2. Project Explorer 中,展开 Camel Contextssrc/main/resources/OSGI-INF/blueprint/blueprint.xml 以公开这两个路由条目。
  3. 双击 Route_route1 条目,在 Design 选项卡中将重点切换为 Route_route1
  4. 在 canvas 上,选择 Choice_choice1 节点,然后点击其 red icon 图标设置无条件断点:

    BPnodeIcons
    forward nav
    BPnodeIcons2
    注意

    在路由编辑器中,您可以通过分别点击节点的 gray icon 图标或其 delete icon 图标来禁用或删除特定的断点。您可以通过右击 canvas 并选择 Delete all breakpoints 来删除所有设置断点。

  5. 在以下 Route_Route1 节点上设置无条件断点:

    • Log_log1
    • SetHeader_setHeader1
    • To_Invalid
    • Log_log2
    • SetHeader_setHeader2
    • To_Fulfill
  6. Project Explorer 中,双击 src/main/resources/OSGI-INF/blueprint 下的 Route_route2,以打开 canvas 上的 Route_route2
  7. 在以下 Route_Route2 节点上设置无条件断点:

    • Choice_choice2
    • SetHeader_setHead_usa
    • Log_usa
    • OT_US
    • SetHeader_setHead_ger
    • Log_ger
    • OT_GER

逐步浏览路由上下文

您可以通过两种方式逐步浏览路由上下文:

  • Step over ( Step Over icon )- 无论断点是什么,都恢复到路由上下文中的下一个执行节点。
  • resume ( Resume icon )- 跳到路由上下文中的下一个活跃断点。

    1. Project Explorer 中,展开 ZooOrderApp 项目的 Camel Contexts 文件夹,以公开 blueprint.xml 文件。
    2. 右键单击 blueprint.xml 文件以打开其上下文菜单,然后点击 Debug AsLocal Camel Context (不带测试)。

      Camel debugger 会在它遇到的第一个断点挂起执行,并询问您是否要打开 Debug 视角:

      tutCnfrmPerspSwitch
    3. 单击 Yes

      注意

      如果您单击 No,则确认窗格会出现多次。在第三个 refusal 后,它会消失,Camel debugger 会恢复执行。要与调试器交互,您需要通过点 WindowOpen Perspective → > Debug 来打开 Debug 视角。

      Debug perspective 将打开,其路由上下文在 _route1 [blueprint.xml] 中的 _choice1 中暂停,如 Debug 视图中所示:

      tutDebugPerspOpen1
      注意

      断点在调试器自动恢复前最多需要五分钟,移至下一个断点或路由上下文的末尾(以下一步为准)。

    4. Variables 视图中,扩展节点以公开每个节点的可用变量和值。

      当您逐步执行路由上下文时,其值自上次断点以黄色突出显示时所更改的变量。您可能需要扩展每个断点的节点,以显示已更改的变量。

    5. Resume icon 进入下一个断点 _log2 in _route1 [blueprint.xml]:

      tutDBResumeLog2Rte1
    6. 展开 Variables 视图中的节点,以检查自 Route1 [blueprintxt.xml] 中 _choice1 的最后一个断点后更改的变量。
    7. Resume icon 进入下一个断点 _setHeader2 [blueprint.xml]

      检查自 Route1 [blueprint.xml] 中 _log2 的 断点以来更改的变量(高亮)。

    8. Debug 视图中,单击 _route1 [blueprint.xml] 中的 _log2,以使用 _route1 [blueprint.xml] 中的 breakpoint _log2 中的 变量值填充 Variables 视图。

      Debug 视图中,您可以在同一消息流中的断点间切换,以快速比较和监控 Variables 视图中的变量值。

      注意

      消息流的长度可能会有所不同。对于传输 Route_route1InvalidOrders 分支的消息,消息流是短的。对于传输 Route_route1 分支(继续到 Route_route2) 的消息,消息流会更长。

    9. 继续逐步浏览路由上下文。当一个消息完成路由上下文并进入路由上下文时,新消息流会出现在 Debug 视图中,标记为一个新的面包屑图标 ID:

      tutDBviewNextMsg

      在这种情况下,ID-janemurpheysmbp-home-55846-1471374645179-0-3 标识第二个消息流,对应于输入路由上下文的 message2.xml。面包屑导航栏 ID 递增 2。

      注意

      交换和消息 ID 相同,在整个消息通过路由上下文期间保持不变。其 ID 由消息流的面包屑导航栏 ID 构建,以 1 递增。因此,如果是 message2.xml,其 ExchangeIdMessageIdID-janemurpheysmbp-home-55846-1471374645179-0-4

    10. message3.xml_route_route1 [blueprint.xml] 中输入 breakpoint _choice1 时,检查 Processor 变量。显示的值是 message1.xmlmessage2.xml 的总指标,之前传输了路由上下文:

      tutMsg3Choice1Stats

      计时指标以毫秒为单位。

    11. 继续通过路由上下文逐步执行每个消息,检查每个处理步骤的变量和控制台输出。当 message6.xmlRoute2 [blueprint.xml] 中输入 breakpoint To_GER 时,调试器开始关闭面包屑导航栏线程。
    12. 在菜单栏中,点 Terminate icon 终止 Camel 调试器。控制台会终止,但您必须手动清除输出。

      注意

      Debug 视图中的 Camel Context 节点下选择了线程或端点时,您必须点 Terminate icon 两次 - 来终止线程或端点,第二个用于终止 Camel 上下文,因此会话。

    13. 在 Menu 栏中,右键单击 tutDebugPersp 以打开上下文菜单,然后选择 Close 以关闭 Debug 视角。

      CodeReady Studio 会自动返回到您启动 Camel 调试器的视角。

    14. Project Explorer 中,右键单击项目,然后选择 Refresh 以刷新显示。

      注意

      如果您预先终止会话,在传输路由上下文的所有消息之前,您可能会在 ZooOrderApp/src/data 文件夹下看到,如下所示: message3.xml.camelLock。您需要将它移除,然后对项目再次运行 debugger。为此,请双击 .camelLock 消息打开其上下文菜单,然后选择 Delete。当被要求时,单击 OK 以确认删除。

    15. 扩展 ZooOrderApp/target/messages/ 目录,以检查消息是否已发送到其预期的目的地:

      tutDualCBRrteVerify

将路由上下文保留原样,且所有断点都设置并启用。

更改变量的值

在本节中,您将变量添加到监视列表中,以便轻松检查其值在通过路由上下文时如何改变。您可以更改消息正文中的变量的值,然后观察更改如何通过路由上下文影响消息路由。

  1. 要在 ZooOrderApp 项目上重新运行 Camel debugger,请右键单击 blueprint.xml 文件,然后单击 Debug AsLocal Camel Context (没有测试)。
  2. 在第一个断点上停止了 message1在 _route1 [blueprint.xml] 中 停止 _choice1,将变量 NodeIdRouteId (在 Exchange category 中)和 MessageBodyCamelFileName (在 Message 类别中)添加到监视列表中。

    对于每个变量:

    1. Variables 视图中,扩展适当的类别来公开目标变量:
    2. 右键点击变量(本例中为 NodeId ),以打开上下文菜单并选择 Watch

      FTVarNodeIDWatch

      Expressions 选项卡将打开,列出您选择的要监视的变量:

      FTWatchM1NodeId
      注意

      通过创建监视列表,您可以轻松检查感兴趣的多个变量的当前值。

  3. 通过路由上下文的第 message1 步,直到到达 _route1 [blueprint.xml] 中的第四个断点 _Fulfill
  4. Variables 视图中,展开 Message 类别。
  5. 将变量 Destination 添加到 watch 列表中。

    Expressions 视图现在应包含这些变量:

    FTWatchM1R1toFfil
    注意
    • 变量列表下的窗格显示所选变量的值。
    • Expressions 视图会保留添加到列表中的所有变量,直到您明确删除它们。
  6. 步骤 message1 通过路由上下文的其余部分,然后逐步 消息2 所有方法。
  7. _route1 [blueprint.xml] 中的 _choice1 中停止 message3
  8. Variables 视图中,展开 Message 类别以公开 MessageBody 变量。
  9. 右键点击 MessageBody 以打开其上下文菜单,然后选择 Change Value

    tutVarChngMenuMsg2
  10. 数量 的值从 15 改为 10 (将其从无效顺序更改为有效顺序):

    tutChgVarsMsg2

    这只更改内存值(它不会编辑 message3.xml 文件)。

  11. 点击 确定
  12. 切换到 Expressions 视图,然后选择 MessageBody 变量。

    变量列表下的窗格显示 message3 的整个正文,从而可以轻松地检查订购项目的当前值:

    FTWatchM2R1toFfilVarChng
  13. Resume icon 进入下一个断点。

    message3 现在遵循 To_Fulfill 和 Route_ route2 的分支,而不是遵循发送到To_FulfillRoute_route2 的分支。

缩小 Camel debugger 的重点

您可以通过禁用和重新启用断点来临时缩小,然后重新扩展调试器的焦点:

  1. Step message4 through the routing context, check the Debug view, the Variables view, and the Console output in each step.
  2. _route1 [blueprint.xml] 中的 _choice1 中停止 message4
  3. 切换到 Breakpoints 视图,然后清除 _choice1 下列出的断点旁边的每个复选框。清除断点的复选框会临时禁用它。

    tutBreakptsDisabled
  4. Resume icon 进入下一个断点:

    tutMsg3toFulfillRte1

    调试器跳过禁用的断点并跳转到 _route1 [blueprint.xml] 中的 _FulFill

  5. 再次点 Resume icon 来进入下一个断点:

    tutMsg3toUKRte2

    debugger 在 _route2 [blueprint.xml] 中跳转到 _GER

  6. Resume icon ,通过路由上下文快速步进 message5message6
  7. 切换到 Breakpoints 视图,再选中所有断点旁边的框以重新启用它们。

验证更改消息变量值的影响

停止调试器并检查更改 'message1's quantity 变量值的结果:

  1. 在工具栏中,点 Terminate icon 终止 Camel 调试器:

    tutDBTerminateNorm
  2. 点击控制台的 Clear output icon 按钮清除输出。
  3. 关闭 Debug 透视图,再返回到您启动 Camel 调试器的视角。
  4. Project Explorer 中,刷新显示。
  5. 扩展 ZooOrderApp/target/messages/ 目录,以检查消息是否按预期发送:

    tutPETargetDestsChngedVars

    您应该会看到只有 message1 发送到 invalidOrders,并且 message3.xml 会出现在 validOrders/Germany 文件夹中。

后续步骤

第 8 章 通过路由追踪消息 教程中,您可以通过路由上下文跟踪信息,以确定您可以在什么位置优化并微调路由上下文的性能。

第 8 章 通过路由追踪消息

通过追踪,您可以截获消息,因为它从一个节点路由到另一个节点。您可以通过路由上下文跟踪消息,以查看您可以在什么位置优化并微调路由上下文的性能。本教程介绍了如何通过路由跟踪消息。

目标

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

  • Fuse Integration 视角中运行 ZooOrderApp
  • ZooOrderApp上启用追踪
  • 将消息放到 ZooOrderApp 中,并通过所有路由节点跟踪它们

先决条件

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

设置 Fuse 集成视角

要设置工作区以方便消息追踪:

  1. 点工具栏右侧的 Open Perspective icon 按钮,然后从列表中选择 Fuse Integration

    tutPerspListFIPselected

    Fuse Integration 视角在默认布局中打开:

    TutFIP 63
  2. JMX Navigator 选项卡拖到 Terminal 选项卡的最右侧,并将其保存在:

    ftTutFIPrearrange

    此安排为 Diagram View 提供了更多空间,以便以图形方式显示路由上下文的节点,这样您可以更轻松地跟踪消息在遍历路由上下文中的路径。

    注意

    为了轻松访问路由上下文 .xml 文件,特别是项目包含多个上下文时,工具会在 Project ExplorerCamel Contexts 文件夹下列出它们。

    此外,路由上下文中的所有路由都直接显示为图标,在其上下文文件条目下直接显示。要在 canvas 上的路由上下文中显示单个路由,请在 Project Explorer 中双击其图标。要显示路由上下文中的所有路由,请双击上下文文件条目。

    TutCamelContextsFolderPE

启动消息追踪

ZooOrderApp 项目中启动消息追踪:

  1. Project Explorer 中,展开 ZooOrderApp 项目,以公开 src/main/resources/OSGI-INF/blueprint/blueprint.xml
  2. 右键单击 src/main/resources/OSGI-INF/blueprint/blueprint.xml 以打开上下文菜单。
  3. 选择 Run AsLocal Camel Context (没有测试)。

    注意

    如果选择 Local Camel Context,则工具将恢复到无需测试的情况下运行,因为您尚未为 ZooOrderApp 项目创建了 JUnit 测试。稍后您将在 第 9 章 使用 JUnit 测试路由 中执行此操作。

  4. JMX 导航器 中,展开 Local process

    tutMsgTrJMXLocalProcessess
  5. 右键单击 maven [ID] 节点,然后选择 Connect
  6. 扩展路由的元素:

    tutMsgTrJMXLCCexpanded
  7. 右键点击 Routes 节点,然后选择 Start Tracing

    tutTraceStart

    该工具在 图表 View 中显示路由上下文的图形表示:

    tutDiagramNodes

    要查看所有消息流路径,您可能需要通过拖动节点以在 Diagram View 选项卡中重新安排节点。您可能还需要调整 Red Hat CodeReady Studio 中其他视图和标签页的大小,以允许 Diagram View 选项卡扩展。

丢弃正在运行的 ZooOrderApp 项目的消息

在运行的 ZooOrderApp 项目中丢弃消息:

  1. Project Explorer 中,展开 ZooOrderApp/src/data,以便您可以访问消息文件(message1.xmlmessage6.xml):

    tutMsgFiles
  2. Drag message1.xml 并将它放到 JMX Navigator 中的 _context1>Endpoints>file>src/data?noop=true 节点上:

    tutJMXLocalCntxtExpanded

    当消息遍历路由时,工具会跟踪并记录每个步骤的 passage。

配置消息视图

您必须刷新 Messages View,然后才能显示消息 trace。如果您希望它们在所有消息跟踪中保留,则需要在 Messages View 中配置列。

  1. 打开 Messages View
  2. 点击面板菜单栏中的 refresh (Refresh 按钮),为视图填充 message1.xml 的消息 trace。
  3. 点面板菜单栏中的 View Menu icon 图标,然后选择 Configure Columns 以打开 Configure Columns 向导:

    TutConfigColsDefaults
    注意

    请注意,在路由上下文中为消息设置的消息标头 Destination 会出现在列表中。

    您可以选择或取消选择 Messages View,从 Messages View 中包含或排除项目。您可以重新安排在 Messages View 中显示的列顺序,通过突出显示各个项目、选定项目并在列表中移动它们。

  4. Configure Columns 向导中,选择并按顺序排序列:

    tutMsgVCnfgColsMnu

    这些列及其顺序将在 Messages View 中保留,直到您再次更改它们。

注意

您可以在所有工具的表中控制列式布局。使用拖动方法临时重新排列表格格式。例如,拖动列的边框规则以扩展或合同其宽度。要隐藏列,请全额合同其边框。拖动列标题以在表中重新定位列。要保留您的安排,您必须使用 ViewConfigure Columns 方法。

逐步浏览消息跟踪

逐步浏览消息跟踪:

  1. 拖动 message2.xml 并将其丢弃在 JMX Navigator 中的 _context1>Endpoints>file>src/data?noop=true 节点上。
  2. Console 切换到 Messages View
  3. Messages View 中,点 refresh (Refresh 按钮)使用 message2.xml 消息跟踪填充视图。

    每次在 JMX Navigator 中丢弃消息时,您需要刷新 Messages View,以使用消息 trace 填充它。

  4. 点消息 trace 之一在 Properties 视图中查看它的详情:

    tutTraceDetails2

    工具在 Properties 视图的前半部分显示消息追踪(包括消息标头)的详细信息,以及 Properties 视图底部的消息实例的内容。因此,如果应用程序在路由中的任何步骤中设置标头,您可以检查 Message Details 以查看它们是否按预期设置。

    您可以通过突出显示每个消息实例来逐步浏览消息实例,以了解特定消息如何遍历路由,并在路由中的每个步骤中按预期处理。

  5. 打开 图表 View,查看 路由中的关联步骤是否已突出显示:

    TutMsgTraceDiagNode

    工具在 Diagram View 中提取路由,标记路径退出具有计时和性能指标(以毫秒为单位)的处理步骤。图中仅显示指标 总交换

  6. 将鼠标指针悬停在显示的指标上,以显示有关消息流的额外指标:

    tutDVnodeMetrics
    • 平均处理消息所需时间
    • 处理消息所花费的最长时间
    • 处理消息的最短时间
  7. 另外,您还可以将 ZooOrderApp/src/data/ 中剩余的信息拖放到 _context1>Endpoints>file>src/data?noop=true 节点(只要启用了追踪)。

    在每个随后的 drop 中,点 refresh (Refresh 按钮)为 Messages View 填充新消息 trace。

  8. 完成后:

    • JMX Navigator 中,右键单击 _context1,然后选择 Stop Tracing Context
    • 打开控制台 并点击面板右上角的 Stop icon 按钮停止控制台。然后点击 Clear icon 按钮来清除控制台输出。

后续步骤

第 9 章 使用 JUnit 测试路由 教程中,您要为项目创建一个 JUnit 测试案例,并以 Local Camel Context 运行您的项目。

第 9 章 使用 JUnit 测试路由

本教程介绍了如何使用 New Camel Test Case 向导来为路由创建测试案例,然后测试路由。

概述

New Camel Test Case 向导会生成一个 boilerplate JUnit 测试案例。当您创建或修改路由(例如,向它添加更多处理器)时,您应该创建或修改生成的测试案例,以添加特定于您创建或更新的路由的预期和断言。这样可确保测试对路由有效。

目标

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

  • 创建 /src/test/ 文件夹以存储 JUnit 测试案例
  • ZooOrderApp 项目生成 JUnit 测试案例
  • 修改新生成的 JUnit 测试案例
  • 修改 ZooOrderApp 项目的 pom.xml 文件
  • 使用新的 JUnit 测试案例运行 ZooOrderApp
  • 观察输出

先决条件

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

  2. Project Explorer 中的 ZooOrderApp 项目的 /src/data/ 目录和 /target/messages/ 子目录中删除任何 trace 生成的消息。trace 生成的消息以 ID- 前缀开头。例如: 图 9.1 “trace 生成的消息” 显示八个追踪生成的信息:

    图 9.1. trace 生成的消息

    tutTraceGenMsgs

    选择批处理中的所有 trace-generated 消息,右键单击并选择 Delete

创建 src/test 文件夹

在为 ZooOrderApp 项目创建 JUnit 测试案例前,您必须为构建路径中包含的文件夹创建一个文件夹:

  1. Project Explorer 中,右键单击 ZooOrderApp 项目,然后选择 NewFolder
  2. New Folder 对话框中,在项目树窗格中展开 ZooOrderApp 节点,再选择 src 文件夹。

    确保 ZooOrderApp/src 出现在 Enter 或选择父文件夹 字段中。

  3. Folder name 中,输入 /test/java

    tutCreateJUnitTestFolder
  4. Finish

    Project Explorer 中,新的 src/test/java 文件夹显示在 src/main/resources 文件夹下:

    tutTestFolderAdded
  5. 验证新的 /src/test/java 文件夹是否包含在构建路径中。

    1. Project Explorer 中,右键单击 /src/test/java 文件夹,以打开上下文菜单。
    2. 选择 Build Path 来查看菜单选项:

      menu 选项 Remove from Build Path 验证 /src/test/java 文件夹目前是否包含在构建路径中:

      tutJavaFolderOnBldPath

创建 JUnit 测试案例

ZooOrderApp 项目创建 JUnit 测试案例:

  1. Project Explorer 中,选择 src/test/java
  2. 右键,然后选择 NewCamel Test Case

    NewCamTstCaseTut
  3. Camel JUnit Test Case 向导中,确保 Source folder 字段包含 ZooOrderApp/src/test/java。要找到正确的文件夹,请点击 browse button
  4. Package 字段中,输入 tutorial.zooapp.route。此软件包将包括新的测试案例。
  5. test 字段中的 Camel XML 文件中,点 browse button 打开配置为过滤 XML 文件的文件管理器,然后选择 ZooOrderApp 项目的 blueprint.xml 文件:

    tutCamXMLUnderTst
  6. 点击 确定Name 字段默认为 BlueprintXmlTest

    tutCamJUnitTstPgComplete
  7. Next 以打开 Test Endpoints 页面。

    默认情况下,会选择所有端点,并将包含在测试案例中。

  8. Finish

    注意

    若有提示,请将 JUnit 添加到构建路径中。

测试的工件添加到项目中,并出现在 src/test/java 下的 Project Explorer 中。实施测试案例的类在工具的 Java 编辑器中打开:

package tutorial.zooapp.route;

import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
import org.junit.Test;

public class BlueprintXmlTest extends CamelBlueprintTestSupport {

	// TODO Create test message bodies that work for the route(s) being tested
	// Expected message bodies
	protected Object[] expectedBodies = { "<something id='1'>expectedBody1</something>",
			"<something id='2'>expectedBody2</something>" };
	// Templates to send to input endpoints
	@Produce(uri = "file:src/data?noop=true")
	protected ProducerTemplate inputEndpoint;
	@Produce(uri = "direct:OrderFulfillment")
	protected ProducerTemplate input2Endpoint;
	// Mock endpoints used to consume messages from the output endpoints and then perform assertions
	@EndpointInject(uri = "mock:output")
	protected MockEndpoint outputEndpoint;
	@EndpointInject(uri = "mock:output2")
	protected MockEndpoint output2Endpoint;
	@EndpointInject(uri = "mock:output3")
	protected MockEndpoint output3Endpoint;
	@EndpointInject(uri = "mock:output4")
	protected MockEndpoint output4Endpoint;

	@Test
	public void testCamelRoute() throws Exception {
		// Create routes from the output endpoints to our mock endpoints so we can assert expectations
		context.addRoutes(new RouteBuilder() {
			@Override
			public void configure() throws Exception {
				from("file:target/messages/invalidOrders").to(outputEndpoint);
				from("file:target/messages/validOrders/USA").to(output3Endpoint);
				from("file:target/messages/validOrders/Germany").to(output4Endpoint);
			}
		});

		// Define some expectations

		// TODO Ensure expectations make sense for the route(s) we're testing
		outputEndpoint.expectedBodiesReceivedInAnyOrder(expectedBodies);

		// Send some messages to input endpoints
		for (Object expectedBody : expectedBodies) {
			inputEndpoint.sendBody(expectedBody);
		}

		// Validate our expectations
		assertMockEndpointsSatisfied();
	}

	@Override
	protected String getBlueprintDescriptor() {
		return "OSGI-INF/blueprint/blueprint.xml";
	}

}

对于 ZooOrderApp 项目,这个生成的 JUnit 测试案例不足,它将无法成功运行。您需要修改它以及项目的 pom.xml,如 “修改 BlueprintXmlTest 文件”一节“修改 pom.xml 文件”一节 所述。

修改 BlueprintXmlTest 文件

您必须将 BlueprintXmlTest.java 文件修改为:

  • 导入多个支持所需文件功能的类
  • 创建用于保存各种源 .xml 文件的内容的变量
  • 读取源 .xml 文件的内容
  • 定义适当的预期

按照以下步骤修改 BlueprintXmlTest.java 文件:

  1. Project Explorer 中,展开 ZooOrderApp 项目,以公开 BlueprintXmlTest.java 文件:

    tutBlueprintXMLTestProjExp
  2. 打开 BlueprintXmlTest.java 文件。
  3. 在 Java 编辑器中,单击 导入 org.apache.camel.EndpointInject; 旁边的展开按钮,以展开该列表。
  4. 添加以粗体文本显示的两行。根据下一部分的指示,添加第一行会导致当您更新 pom.xml 文件时解析的错误。

    package tutorial.zooapp.route;
    
    import org.apache.camel.EndpointInject;
    import org.apache.camel.Produce;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.component.mock.MockEndpoint;
    import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
    import org.apache.commons.io.FileUtils;
    import org.junit.Test;
    import java.io.File;
  5. 向下滚动到直接在 // 预期消息正文后面的 行。
  6. 将这些行替换有 保护的 Object[] expectedBodies={ …​…​ expectedBody2</something>"}; to these protected-busybox with those protected String body"; 行:

    protected String body1; protected String body2; protected String body3; protected String body4; protected String body5; protected String body6;
  7. 向下滚动到行 public void testCamelRoute ()会抛出 Exception {,并在它后面直接插入行 body Serial = FileUtils.readFileToString (new File ("src/data/message failing.xml"), "UTF-8"); 如下所示。这些行将指示错误,直到您按照下一节中的指示更新 pom.xml 文件。

    // Valid orders body2 = FileUtils.readFileToString(new File("src/data/message2.xml"), "UTF-8"); body4 = FileUtils.readFileToString(new File("src/data/message4.xml"), "UTF-8"); body5 = FileUtils.readFileToString(new File("src/data/message5.xml"), "UTF-8"); body6 = FileUtils.readFileToString(new File("src/data/message6.xml"), "UTF-8"); // Invalid orders body1 = FileUtils.readFileToString(new File("src/data/message1.xml"), "UTF-8"); body3 = FileUtils.readFileToString(new File("src/data/message3.xml"), "UTF-8");
  8. 向下滚动到在 // TODO Ensure 预期之后直接遵循的行,对我们正在测试的路由有意义
  9. 将以 outputEndpoint.expectedBodiesReceivedInAnyOrder (expectedBodies) 开头的代码块替换为 …​inputEndpoint.sendBody (expectedBody); } 替换为此处显示的行:

    // Invalid orders outputEndpoint.expectedBodiesReceived(body1, body3); // Valid orders for USA output3Endpoint.expectedBodiesReceived(body2, body5, body6); // Valid order for Germany output4Endpoint.expectedBodiesReceived(body4);

    将剩余的代码保留原样。

  10. 保存该文件。
  11. 检查您更新的 BlueprintXmlTest.java 文件是否具有所需的修改。它应该类似如下:

    package tutorial.zooapp.route;
    
    import org.apache.camel.EndpointInject;
    import org.apache.camel.Produce;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.component.mock.MockEndpoint;
    import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
    import org.apache.commons.io.FileUtils;
    import org.junit.Test;
    import java.io.file;
    
    public class BlueprintXmlTest extends CamelBlueprintTestSupport {
    
    	// TODO Create test message bodies that work for the route(s) being tested
    	// Expected message bodies
    	protected String body1;
    	protected String body2;
    	protected String body3;
    	protected String body4;
    	protected String body5;
    	protected String body6;
    	// Templates to send to input endpoints
    	@Produce(uri = "file:src/data?noop=true")
    	protected ProducerTemplate inputEndpoint;
    	@Produce(uri = "direct:OrderFulfillment")
    	protected ProducerTemplate input2Endpoint;
    	// Mock endpoints used to consume messages from the output endpoints and then perform assertions
    	@EndpointInject(uri = "mock:output")
    	protected MockEndpoint outputEndpoint;
    	@EndpointInject(uri = "mock:output2")
    	protected MockEndpoint output2Endpoint;
    	@EndpointInject(uri = "mock:output3")
    	protected MockEndpoint output3Endpoint;
    	@EndpointInject(uri = "mock:output4")
    	protected MockEndpoint output4Endpoint;
    
    	@Test
    	public void testCamelRoute() throws Exception {
    		// Create routes from the output endpoints to our mock endpoints so we can assert expectations
    		context.addRoutes(new RouteBuilder() {
    			@Override
    			public void configure() throws Exception {
    				// Valid orders
    				body2 = FileUtils.readFileToString(new File("src/data/message2.xml"), "UTF-8");
    				body4 = FileUtils.readFileToString(new File("src/data/message4.xml"), "UTF-8");
    				body5 = FileUtils.readFileToString(new File("src/data/message5.xml"), "UTF-8");
    				body6 = FileUtils.readFileToString(new File("src/data/message6.xml"), "UTF-8");
    
    				// Invalid orders
    				body1 = FileUtils.readFileToString(new File("src/data/message1.xml"), "UTF-8");
    				body3 = FileUtils.readFileToString(new File("src/data/message3.xml"), "UTF-8");
    
    				from("file:target/messages/invalidOrders").to(outputEndpoint);
    				from("file:target/messages/validOrders/USA").to(output3Endpoint);
    				from("file:target/messages/validOrders/Germany").to(output4Endpoint);
    				from("direct:OrderFulfillment").to(output2Endpoint);
    			}
    		});
    
    		// Define some expectations
    
    		// TODO Ensure expectations make sense for the route(s) we're testing
    		// Invalid orders
    		outputEndpoint.expectedBodiesReceived(body1, body3);
    
    		// Valid orders for USA
    		output3Endpoint.expectedBodiesReceived(body2, body5, body6);
    
    		// Valid order for Germany
    		output4Endpoint.expectedBodiesReceived(body4);
    
    		// Validate our expectations
    		assertMockEndpointsSatisfied();
    	}
    
    	@Override
    	protected String getBlueprintDescriptor() {
    		return "OSGI-INF/blueprint/blueprint.xml";
    	}
    
    }

修改 pom.xml 文件

您需要将对 commons-io 项目的依赖添加到 ZooOrderApp 项目的 pom.xml 文件中:

  1. Project Explorer 中,选择位于目标文件夹下的 pom.xml,然后在工具的 XML 编辑器中打开它。
  2. 单击页面底部的 pom.xml 选项卡,以打开文件进行编辑。
  3. 将这些行添加到 < dependencies&gt; 部分的末尾:

    <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.5</version>
           <scope>test</scope>
    </dependency>
  4. 保存该文件。

运行 JUnit 测试

运行测试:

  1. 切换到 JBoss 透视图以释放更多工作区。
  2. Project Explorer 中,右键单击 ZooOrderApp 项目。
  3. 选择 Run AsJUnit Test

    默认情况下,JUnit 视图在侧边栏中打开。(为了提供更好的视图,将其拖到底部,右面板显示 控制台服务器以及 属性 选项卡。)

    注意

    有时,当 JUnit 首次在项目上运行时,测试会失败。再次运行测试会得到成功的结果。

    如果测试成功运行,您会看到类似如下的内容:

    图 9.2. 成功 JUnit 运行

    JUnit 成功

    当测试失败时,您会看到类似如下的内容:

    图 9.3. JUnit 运行失败

    JUnit 失败
    注意

    如果您的执行环境没有设置为 Java SE 8,则 JUnit 将失败。JUnit 选项卡顶部的消息栏将显示一条错误消息,指出它无法找到正确的 SDK。

    要解决这个问题,打开项目的上下文菜单,然后选择 Run AsRun Configuration → JRE。点 *Execution environment 字段旁边的 Environments] 按钮 找到并选择 Java SE 8 环境。

  4. 检查输出并采取措施来解决任何测试失败。

    要查看 JUnit 面板中显示的更多错误,请单击面板菜单栏中的 Maximize button 以最大化视图。

    在再次运行 JUnit 测试案例前,从 Project Explorer 中的 ZooOrderApp 项目的 /src/data 文件夹中删除所有 JUnit 生成的测试消息(请参阅 图 9.1 “trace 生成的消息”)。

进一步阅读

要了解有关 JUnit 测试的更多信息,请参阅 JUnit

后续步骤

第 10 章 将项目发布到红帽 Fuse 教程中,您将了解如何将 Apache Camel 项目发布到红帽 Fuse 中。

第 10 章 将项目发布到红帽 Fuse

本教程介绍了将项目发布到红帽 Fuse 的过程。它假设您已在运行 Red Hat Fuse 工具的同一机器上安装了一个 Red Hat Fuse 实例。

目标

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

  • 定义 Red Hat Fuse 服务器
  • 配置发布选项
  • 启动 Red Hat Fuse 服务器并发布 ZooOrderApp 项目
  • 连接到 Red Hat Fuse 服务器
  • 验证 ZooOrderApp 项目的捆绑包是否已成功构建并发布
  • 卸载 ZooOrderApp 项目

先决条件

在开始本教程前:

定义 Red Hat Fuse Server

定义服务器:

  1. 打开 Fuse Integration 透视图。
  2. 单击右下角的 Servers 选项卡,以打开 Servers 视图。
  3. No servers 可用。点击此链接来创建新 server…​ 链接,以打开 Define a New Server 页面。

    注意

    要在已经定义时定义新服务器,请在 Servers 视图中右键单击,然后选择 NewServer

  4. 扩展 Red Hat JBoss Middleware 节点以公开可用的服务器选项:

    tutDefineNewServer
  5. 选择 Red Hat Fuse 服务器。
  6. 接受 服务器主机名(localhost)和 服务器名称 (Fuse n.n Runtime Server)的默认值,然后单击 Next 以打开 Runtime 页面:

    tutFuseRuntimeDef1
    注意

    如果您尚未安装 Fuse,现在可以使用 Download and install runtime 链接下载它。

    如果您已经定义了服务器,工具会跳过此页面,并显示配置详情页面。

  7. 接受 名称 的默认值。
  8. 单击 Home Directory 字段旁边的 Browse,以导航到安装并选择它。
  9. Execution Environment 旁边的下拉菜单中选择运行时 JRE。

    选择 JavaSE-1.8 (推荐)。如有必要,单击 Environments 按钮,将其从列表中选中。

    注意

    Fuse 服务器需要 Java 8 (推荐)。要为 Execution Environment 选择它,您必须已安装了它。

  10. Alternate JRE 选项保留原样。
  11. Next 以保存 Fuse 服务器的运行时定义,并打开 Fuse 服务器配置详情页面

    NewServerDetailsTut
  12. 接受 SSH 端口 的默认端口(8101)。

    运行时使用 SSH 端口来连接服务器的 Karaf shell。如果此默认不正确,您可以通过在 Red Hat Fuse installDir/etc/org.apache.karaf.shell.cfg 文件中查找正确的端口号。

  13. 用户名 中,输入用于登录服务器的名称。

    这是存储在 Red Hat Fuse installDir'/etc/users.properties' 文件中的用户名。

    注意

    如果在 /etc/users.properties 文件中激活(未添加) 默认用户,工具将使用默认用户名和密码自动填充用户名和密码。

    如果没有设置,您可以使用格式 user=password,role (如 joe=secret,Administrator)添加到该文件中,也可以使用 karaf jaas 命令集设置:

    • jaas:realms swig-wagonto 列出域
    • jaas:manage --index 1 swig- swigto 编辑第一个(server)域
    • jaas:useradd <username> <password > HEKETI- swigto 添加用户和关联的密码
    • jaas:roleadd <username> Administrator wagon-rhacmto 指定新用户的角色
    • jaas:update HEKETI- swigto 使用新的用户信息更新域

      如果已经为服务器选择了 jaas 域,您可以通过发出 JBossFuse:karaf@root>jaas:users 来发现用户名。

  14. Password 中,键入 用户名 所需的密码以登录到服务器。

    这是在红帽 Fuse 的 installDir/etc/users.properties 文件中或 karaf jaas 命令中设定的密码。

  15. Finish

    Runtime Server [stopped, Synchronized] 会出现在 Servers 视图中。

  16. Servers 视图中,展开 Runtime Server:

    JBFuseServersView

    JMX[Disconnected]Runtime Server [stopped, Synchronized] 条目下显示为节点。

配置发布选项

使用发布选项,您可以配置 ZooOrderApp 项目如何以及何时发布到正在运行的服务器:

  • 在保存对项目所做的更改后自动自动
  • 更改并保存项目后自动配置的间隔
  • 选择发布操作时手动

在本教程中,您可以在保存对 ZooOrderApp 项目的更改时配置立即发布。要做到这一点:

  1. Servers 视图中,双击 Runtime Server [stopped, Synchronized] 条目,以显示其概览。
  2. 在服务器的 Overview 页面中,展开 Publishing 部分以公开选项。

    srvEditorPubOpts

    确保启用 资源更改时,自动发布 选项。

    (可选)更改 发布间隔 值,以便在进行更改时加快或延迟发布项目。

  3. Servers 视图中,点 Start the server
  4. 等待几秒钟,使服务器启动。当它这样做时:

    • Terminal 视图显示 splash 屏幕:

      tutServerStartShellV
    • Servers 视图显示:

      tutServerStartServerV
    • JMX Navigator 显示 n.n Runtime Server[Disconnected

      tutServerStartJMXNav
  5. Servers 视图中,右键单击 n.n Runtime Server [Started],然后选择 Add and Remove 以打开 Add 和 Remove 页面:

    tutAddRemove1

    确保 如果服务器启动,则立即检查发布更改

  6. 选择 ZooOrderApp 并点 Add 将其分配给 Fuse 服务器:

    tutAddRemove2
  7. Finish

    Servers 视图应该显示以下内容:

    tutCBRrtePublishedSrvV
    • Runtime Server [Started, Synchronized]

      注意

      对于服务器,同步 意味着服务器上发布的所有模块都与其本地对应的项相同。

    • ZooOrderApp [Started, Synchronized]

      注意

      对于模块,sync 表示公布的模块与其本地对应的模块相同。由于启用了自动发布,因此对 ZooOrderApp 项目所做的更改将以秒为单位发布(根据 发布间隔的值)。

    • JMX[Disconnected]

连接到运行时服务器

连接到运行时服务器后,您可以看到 ZooOrderApp 项目的已发布元素并与它们交互。

  1. Servers 视图中,双击 JMX[Disconnected] 以连接到运行时服务器。
  2. JMX Navigator 中,展开 Camel 文件夹以公开 ZooOrderApp 的元素。

    tutJMXconnected
  3. Bundles 节点,使用运行时服务器上安装的捆绑包列表填充 Properties 视图:

    tutCBRrouteBundleInstall
  4. Search 字段中,键入 ZooOrderApp。显示对应的捆绑包:

    tutCBRrouteBundleSearch
    注意

    或者,您可以在 Terminal 视图中发出 osgi:list 命令,以查看在服务器运行时上安装的生成的捆绑包列表。该工具对 OSGi 捆绑包使用不同的命名方案,由 osgi:list 命令显示。在这种情况下,命令会返回 Camel Blueprint Quickstart,它出现在安装捆绑包列表的末尾。

    在项目的 pom.xml 文件的 < build > 部分中,您可以找到捆绑包的符号链接名称及其捆绑包名称(OSGi)在 maven-bundle-plugin 条目中列出的:

    tutBundleNamesPom

卸载 ZooOrderApp 项目

注意

您不需要断开 JMX 连接或停止服务器来卸载发布的资源。

从运行时服务器中删除 ZooOrderApp 资源:

  1. Servers 视图中,右键单击 n.n Runtime Server 以打开上下文菜单。
  2. 选择 "添加和删除"

    tutUnpubCBRroute
  3. Configured 列中,选择 ZooOrderApp,然后单击 RemoveZooOrderApp 资源移到 Available 列中。
  4. Finish
  5. Servers 视图中,右键单击 JMX[Connected],然后单击 Refresh

    JMX[Connected] 下的 Camel 树会消失。

    注意

    JMX Navigator 中,Server Connections > n.n Runtime Server[Connected] 下的 Camel 树也会消失。

  6. Properties 视图中显示的 Bundles 页面时,向下滚动到列表的末尾,以验证 ZooOrderApp 的捆绑包不再被列出。

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.