工具 Tutorials

Red Hat Fuse 7.7

工具 Tutorials

Red Hat Fuse Documentation Team

摘要

本指南包含多个简单教程,其演示了如何使用 Red Hat Fuse Tooling 提供的工具来开发和测试应用程序。

第 1 章 关于 Fuse 工具教程

Red Hat Fuse Tooling 教程提供了使用 Fuse 工具开发、运行、测试和部署 Apache Camel 应用程序的实践介绍。

先决条件

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

Fuse 工具教程概述

以下是教程概述以及您在每个教程中完成的内容:

有关 Fuse 工具功能的详情,请查看 工具用户指南

关于示例应用程序

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

通过使用 Fuse 工具,您可以创建一个包含传入样本消息的 Blueprint 项目,根据其内容(与无效订购)过滤它们,然后根据 zoo 的位置(country)进一步排序有效顺序。在后面的教程中,您可以使用示例应用程序调试路由上下文,通过路由跟踪消息,使用 JUnit 测试路由,最后发布 Fuse 项目。

关于资源文件

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

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

消息
此文件夹包含六个消息文件,名为 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. Open Red Hat CodeReady Studio.

    当您首次启动 CodeReady Studio 时,它会在 JBoss 视角中打开:

    JBoss Perspective on startup

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

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

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

    保留选中 Use default workspace location 选项。

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

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

    注意

    您可以在 第 10 章 将项目发布到红帽 Fuse 教程后添加运行时。

  7. 接受默认的 Apache Camel 版本

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

    高级项目设置
  9. Finish

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

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

    tutSwitchToFIP
  10. 单击 Yes

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

    tutEmptyProjectOpen

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

    • ZooOrderApp/pom.xml mvapich-PROFILEA Maven 项目文件。

      生成的 blueprint.xml 和 pom.xml 文件
    • ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml mvapich-DESTINATIONA 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. Apply and Close

下载项目的测试消息

提供了 XML 消息文件示例,以便您可以在通过 Tooling Tutorials 时测试 ZooOrderApp 项目。消息包含 zoo animals 的订购信息。例如,Chicago zoo 的五个 wombats 的顺序。

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

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

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

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

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

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

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

查看测试信息

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

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

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

    XML 文件在 Editor 视图中打开。

    例如,message1.xml 文件的内容显示来自 Bronx Zoo for 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)。

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

表 2.1. 提供的测试消息

msg#<name><city><country><animal><quantity>

1

Bronx Zoo

Bronx NY

USA

Wombat

12

2

SAN Diego Zoo

SAN Diego CA

USA

giraffe

3

3

SEA 生命周期中心

Munich

德国

penguin

15

4

Berlin Zoo

Berlin

德国

emu

6

5

kourieradelphia Zoo

Philapelphia PA

USA

giraffe

2

6

st Louis Zoo

st Loius MO

USA

penguin

10

后续步骤

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

第 3 章 定义路由

本教程介绍了向路由中添加和配置端点的步骤。端点为通过路由传输的信息定义源和接收器。对于 ZooOrderApp 项目,start (source)端点是包含 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 从面板的Components drawer 拖到 canvas,并将它放到 Route_route1 容器节点上。

    File 组件会更改为 Route _route1 容器节点内的来自 _from 1 节点。

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

    Properties 视图(位于 canvas 下)显示节点用于编辑的属性字段。

  3. 要指定消息文件的源目录,在 Properties 视图中点 Advanced 标签页:

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

    FileSystemCompPropsTut

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

  5. Consumer 选项卡中,点 Noop 选项启用其复选框。

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

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

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

    FileSystemCompPropsTut2
    注意

    工具使用下划线(_)前缀自动生成的 ID 值。您可以选择更改 ID 值。下划线前缀不是必需的。

    将自动生成的 Id 保留为。

  7. 选择 FileSave 以保存路由。

配置 sink 端点

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

  1. 面板的 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
    注意

    根据路由编辑器的布局方向首选项设置,这两个文件节点已连接并在 canvas 上保持一致。选择为 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 章 运行路由

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

目标

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

  • 将路由作为本地 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 章 添加基于内容的路由器 教程中,您添加基于内容的路由,该路由器使用消息的内容来确定其目的地。

第 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 章 将另一个路由添加到路由上下文 中,您可以添加第二个路由来进一步处理有效顺序信息。

第 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 工具调试器。

第 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. Design 选项卡中,双击 Route_route1 条目,将重点切换到 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
    • To_US
    • SetHeader_setHead_ger
    • Log_ger
    • To_GER

逐步浏览路由上下文

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

  • Step over ( Step Over icon )- 转至路由上下文中的下一个执行节点,而不考虑断点。
  • 恢复( Resume icon )- 在路由上下文中转至下一个活跃断点。

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

      Camel 调试器会在遇到的第一个断点挂起执行,并询问您现在是否要打开 Debug 透视图:

      tutCnfrmPerspSwitch
    3. 单击 Yes

      注意

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

      Debug 视角会打开,并显示在 _route1 [blueprint.xml] 中的 _choice1 暂停的路由上下文,如 Debug 视图所示:

      tutDebugPerspOpen1
      注意

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

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

      当您完成路由上下文时,自上色中突出显示了最后一个断点后,其值已更改的变量。您可能需要在每个断点扩展节点,以显示已更改的变量。

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

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

      检查更改的变量(高亮),因为 Route1 [blueprint.xml] 中的断点是 _log2

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

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

      注意

      消息流的长度可能会有所不同。对于传输 Route_route1InvalidOrders 分支的消息,消息流会比较短。对于传输 Route_route1ValidOrders 分支的消息,其继续到 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] 中的断点 _choice1 时,检查 Processor 变量。显示的值是为 message1.xmlmessage2.xml 累计的指标,之前传输了路由上下文:

      tutMsg3Choice1Stats

      时间指标以毫秒为单位。

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

      注意

      Debug 视图中的 Camel Context node 下选择线程或端点时,您必须点击 Terminate icon 两次 - 首先终止线程或端点,第二次终止 Camel 上下文,因此会话。

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

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

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

      注意

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

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

      tutDualCBRrteVerify

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

更改变量的值

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

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

    对于每个四个变量:

    1. Variables 视图中,展开适当的类别以公开 target 变量:
    2. 在变量(本例中为 NodeId )打开上下文菜单并选择 Watch:

      FTVarNodeIDWatch

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

      FTWatchM1NodeId
      注意

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

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

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

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

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

    tutChgVarsMsg2

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

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

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

    FTWatchM2R1toFfilVarChng
  13. Resume icon 进入下一步。

    message3 现在遵循导致To_FulfillRoute_route2 的分支,而不是跟随 To_Invalid 的分支。

缩小 Camel 调试器的重点范围

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

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

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

    tutMsg3toFulfillRte1

    debugger 在禁用的断点上跳过,并跳转到 _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

    此安排提供了更多空间,以便诊断路由上下文的节点以图形方式显示路由上下文的节点,从而可以更轻松地查看消息遍历路由上下文的路径。

    注意

    为了便于访问路由上下文 .xml 文件,特别是当项目由多个上下文组成时,工具会在 Project Explorer 中的 Camel 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 Navigator 中,展开 本地进程

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

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

    tutTraceStart

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

    tutDiagramNodes

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

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

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

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

    tutMsgFiles
  2. Drag message1.xml 将其放到 _context1>Endpoints>file>src/data?noop=true 节点上:

    tutJMXLocalCntxtExpanded

    当消息会遍历路由时,工具追踪并记录其传递。

配置消息视图

您必须在显示消息追踪前刷新 Messages View。如果您希望它们在所有消息跟踪中保留,您还需要在 Messages View 中配置列。

  1. 打开 Messages 视图
  2. 点击顶部的 refresh (Refresh 按钮),在面板菜单栏的右侧使用 message1.xml 信息跟踪填充视图。
  3. 点面板菜单栏中的 View Menu icon 图标,然后选择 Configure Columns 以打开 Configure Columns 向导:

    TutConfigColsDefaults
    注意

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

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

  4. Configure Columns 向导中,以这种方式选择并排序列:

    tutMsgVCnfgColsMnu

    这些列及其顺序将保留在 消息视图中, 直到您再次更改它们。

注意

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

逐步浏览消息追踪

逐步浏览消息跟踪:

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

    每次丢弃 JMX Navigator 中的消息时,您需要刷新 Messages View 以填充消息跟踪。

  4. 点击其中一个信息跟踪在 Properties 视图中查看它的更多详情:

    tutTraceDetails2

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

    您可以通过突出显示消息实例来逐步浏览消息实例,以查看特定消息如何遍历路由,以及路由中每个步骤是否按预期处理。

  5. 打开 Diagram View 以查看路由中的相关步骤已突出显示:

    TutMsgTraceDiagNode

    这些工具以 图表 视图中提取路由,标记路径退出处理步骤,包含时间和性能指标(以毫秒为单位)。图中仅显示 指标 Total Exchange。

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

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

    在每个后续丢弃中,请记住点 refresh (刷新按钮)使用新消息跟踪填充 Messages View

  8. 完成后:

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

后续步骤

第 9 章 使用 JUnit 测试路由 教程中,您可以为项目创建一个 JUnit 测试案例,并将项目作为 本地 Camel 上下文 运行。

第 9 章 使用 JUnit 测试路由

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

概述

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

目标

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

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

先决条件

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

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

    图 9.1. 跟踪生成的消息

    tutTraceGenMsgs

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

创建 src/test 文件夹

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

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

    确保 ZooOrderApp/src 出现在 Enter 或选择 parent folder 字段中。

  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 以查看菜单选项:

      菜单选项 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 文件的文件 explorer,然后选择 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 编辑器中,单击 import 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. 向下滚动到在 // Expected 消息正文 后直接遵循的行。
  6. 使用这些 受保护的 String body#; 行替换这些行来保护的 Object[] expectedBodies={ …​…​ expectedBody2</something>"}; iwl-DESTINATION to these 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# = FileUtils.readFileToString (new File ("src/data/message#.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 expectations 之后直接遵循的行,对我们测试的路由有意义
  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> 部分的末尾添加以下行:

    <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 “跟踪生成的消息”)。

进一步阅读

要了解有关 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 are available.点击此链接来创建新 server…​ 链接,以打开 Define a New Server 页面。

    注意

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

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

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

    tutFuseRuntimeDef1
    注意

    如果您还没有安装 Fuse,则可以使用 Download and install runtime 链接下载它。

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

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

    选择 JavaSE-1.8 (推荐)。如有必要,点 Environments 按钮从列表中选择它。

    注意

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

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

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

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

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

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

    注意

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

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

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

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

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

    这是在 Red Hat Fuse 的 installDir/etc/users.properties 文件中或 karaf jaas 命令中设置的密码。

  15. Finish

    运行时服务器 [stopped, Synchronized] 会出现在 Servers 视图中。

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

    JBFuseServersView

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

配置发布选项

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

  • 在保存对项目所做的更改时,立即自动执行
  • 在更改并保存项目后,自动配置间隔
  • 手动,当您选择 publish 操作时

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

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

    srvEditorPubOpts

    确保启用了 资源更改时 Automatically publish publish 选项。

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

  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 and Remove 页面:

    tutAddRemove1

    确保 选项 如果启动了 server,则将立即检查发布更改

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

    tutAddRemove2
  7. Finish

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

    tutCBRrtePublishedSrvV
    • 运行时服务器 [Started, Synchronized]

      注意

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

    • ZooOrderApp [Started, Synchronized]

      注意

      对于模块 同步,sync 表示已发布的模块与其本地对应的模块相同。因为启用自动发布,所以对 ZooOrderApp 项目所做的更改会按秒发布(根据出 间隔的值)。

    • JMX[断开连接]

连接到运行时服务器

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

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

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

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

    tutCBRrouteBundleSearch
    注意

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

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

    tutBundleNamesPom

卸载 ZooOrderApp 项目

注意

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

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

  1. Servers 视图中,右键单击 n.n Runtime Server 以打开上下文菜单。
  2. 选择 Add and Remove:

    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 © 2023 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.