工具 Tutorials
如何在 CodeReady Studio 中使用 Fuse Tooling 的示例
摘要
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看我们的 CTO Chris Wright 信息。
第 1 章 关于 Fuse 工具教程
Red Hat Fuse Tooling 教程提供了使用 Fuse 工具开发、运行、测试和部署 Apache Camel 应用程序的实践介绍。
先决条件
开始之前,您应该熟悉以下软件:
Fuse 工具教程概述
以下是教程概述以及您在每个教程中完成的内容:
创建 Fuse 集成项目并设置教程资源文件(示例消息和路由上下文文件)。当您创建项目时,它会自动创建路由上下文和初始路由。
定义简单路由的端点,从文件夹中检索消息并将其复制到另一个文件夹中。
查看测试消息。运行路由,并通过查看测试消息从源文件夹复制到目标文件夹来验证它是否正常工作。
添加基于内容的路由器,以过滤消息并根据消息中的内容将它们复制到不同的目标文件夹中。
添加另一个路由,进一步过滤消息并根据消息中的内容将它们复制到不同的目标文件夹中。
使用 Camel 调试器设置断点,然后逐步浏览路由来检查路由和消息变量。
将消息放到路由上,并通过所有路由节点跟踪它们。
为路由创建一个 JUnit 测试案例,然后测试路由。
逐步执行将 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
这个文件夹包含三个路由上下文文件:
Blueprint1.xml
- 这是从完成 第 3 章 定义路由 教程生成的解决方案路由上下文。您可以将其用作以下教程的起点:-
Blueprint2.xml
- 这是 第 5 章 添加基于内容的路由器 教程的解决方案上下文文件。您可以使用blueprint2.xml
作为 第 6 章 将另一个路由添加到路由上下文 教程的起点。 Blueprint3.xml
- 这是 第 6 章 将另一个路由添加到路由上下文 教程的解决方案上下文文件。您可以使用blueprint3.xml
作为这些教程的起点:
第 2 章 设置您的环境
本教程介绍了创建 Fuse 集成项目的过程。该项目包含一个初始路由和默认的 CamelContext。路由是消息通过的处理器链。CamelContext 是一个单一路由规则基础,用于定义用于配置路由的上下文,并指定在端点(邮件源和目标)之间消息交换时要使用的策略。
在遵循任何其他教程前,您必须完成此教程。
目标
在本教程中,您将完成以下任务:
- 创建 Fuse 集成项目
- 为您的项目下载测试消息(XML 文件)
- 查看测试信息
开始前
在设置 Fuse 集成项目前,您必须使用 Fuse 工具安装 Red Hat CodeReady Studio。有关如何安装 CodeReady Studio 的详情,请查看 红帽客户门户网站 以获取您的平台安装指南。
在按照 第 10 章 将项目发布到红帽 Fuse 教程中的步骤操作前,您必须安装 Java 8。
创建 Fuse 集成项目
Open Red Hat CodeReady Studio.
当您首次启动 CodeReady Studio 时,它会在 JBoss 视角中打开:
否则,它会在之前的 CodeReady Studio 会话中使用的视角中打开。
在菜单中,选择 File → New → Fuse Integration Project 以打开 New Fuse Integration Project 向导:
在 Project Name 字段中,输入
ZooOrderApp
。保留选中 Use default workspace location 选项。
点 Next 打开 Select a Target Runtime 页面:
- 为部署平台选择 Standalone。
选择 Karaf/Fuse,并接受为运行时 选择的 None。
注意您可以在 第 10 章 将项目发布到红帽 Fuse 教程后添加运行时。
接受默认的 Apache Camel 版本。
点 Next 打开 Advanced Project Setup 页面,然后选择 Empty - Blueprint DSL 模板:
点 Finish。
Fuse Tooling 开始从 Maven 存储库下载 - 从构建项目所需的所有文件,然后将新项目添加到 Project Explorer 视图中。
如果 CodeReady Studio 尚未显示 Fuse 集成 视角,它会询问您现在是否要切换到它:
单击 Yes 。
新的 ZooOrderApp 项目在 Fuse 集成 视角中打开:
ZooOrderApp 项目包含您需要创建和运行路由的所有文件,包括:
ZooOrderApp/pom.xml
mvapich-PROFILEA Maven 项目文件。-
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
mvapich-DESTINATIONA Blueprint XML 文件,其中包含 Camel 路由上下文和一个初始空路由。
要查看初始路由上下文,请在 Editor 视图中打开
blueprint.xml
文件,然后点 Source 选项卡。
设置组件标签以显示 ID 值
确保在 Design canvas 上放置的模式和组件标签与工具 Tutorials 中显示的标签相同:
打开 Editor 首选项页面:
- 在 Linux 和 Windows 机器上,选择 Windows → Preferences → Fuse Tooling → Editor。
- 在 OS X 中,选择 CodeReady Studio → Preferences → Fuse Tooling → Editor。
检查 所有组件标签选项的 Use ID 值。
- 点 Apply and Close。
下载项目的测试消息
提供了 XML 消息文件示例,以便您可以在通过 Tooling Tutorials 时测试 ZooOrderApp 项目。消息包含 zoo animals 的订购信息。例如,Chicago zoo 的五个 wombats 的顺序。
将提供的测试消息(XML 文件)下载到您的项目:
在 CodeReady Studio Project Explorer 视图中,创建一个文件夹来包含测试消息:
-
右键单击
ZooOrderApp/src
文件夹,然后选择 New → Folder。此时会打开 New Folder 向导。 -
对于 文件夹名称,请键入
data
。 - 点 Finish。
-
右键单击
单击此处 以打开 Web 浏览器,进入提供的 Tooling Tutorial 资源
Fuse-tooling-tutorials-jbds-10.3.zip
文件的位置。将
Fuse-tooling-tutorials-jbds-10.3.zip
文件下载到 ZooOrderApp 项目工作区以外的方便位置,然后解压缩它。它包含两个文件夹,如 第 1 章 关于 Fuse 工具教程 所述。从 消息 文件夹中,将六个 XML 文件复制到您的 ZooOrderApp 项目的
src/data
文件夹。注意您可以安全地忽略 XML 文件中的 。
查看测试信息
每个 XML 消息文件都包含来自 zoo (客户)的顺序,用于数量 aimals。例如,'message1.xml' 文件包含来自 Brooklyn Zoo for 12 wombats 的顺序。
您可以在 Editor 视图中打开任何消息 XML 文件来检查内容。
- 在 Project Explorer 视图中,右键单击消息文件。
- 从弹出菜单中选择" 打开 "。
点 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
文件的第一行中安全地忽略
,它建议您没有文档引用的 grammar 约束(DTD 或 XML Schema)。
下表提供了所有 6 个消息文件的内容概述:
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)端点是您在项目中指定的另一个文件夹。
目标
在本教程中,您将完成以下任务:
- 在路由中添加源和接收器端点
- 配置端点
- 连接端点
开始前
开始此教程前:
- 您必须设置工作区环境,如 第 2 章 设置您的环境 指南所述。
-
在 CodeReady Studio 中,在 Editor 视图中打开
ZooOrderApp
项目的/src/main/resources/OSGI-INF/blueprint/blueprint.xml
文件。 -
如果需要,请单击 Editor 视图底部的 Design 选项卡,以查看标记为
Route_route1
的初始路由的图形显示。
配置源端点
按照以下步骤将 src/data
文件夹配置为路由的源端点:
将文件组件 从面板的Components drawer 拖到 canvas,并将它放到
Route_route1
容器节点上。File 组件会更改为
Route
1 节点。_route1
容器节点内的来自 _from在 canvas 上,选择
From _from1
节点。Properties 视图(位于 canvas 下)显示节点用于编辑的属性字段。
要指定消息文件的源目录,在 Properties 视图中点 Advanced 标签页:
在 Directory Name 字段中,输入
src/data
:路径
src/data
相对于项目的目录。在 Consumer 选项卡中,点 Noop 选项启用其复选框。
Noop 选项可防止
消息#.xml
文件从src/data
文件夹中删除,它会启用 idempotency 以确保每个消息#.xml
文件只消耗一次。选择 Details 选项卡以打开文件节点的 Details 页面。
请注意,工具会自动将 Uri 字段填充您在 Advanced 选项卡上配置的 Directory Name 和 Noop 属性。它还使用自动生成的 ID (
_from1
)填充 Id 字段:注意工具使用下划线(_)前缀自动生成的 ID 值。您可以选择更改 ID 值。下划线前缀不是必需的。
将自动生成的 Id 保留为。
- 选择 File → Save 以保存路由。
配置 sink 端点
添加并配置路由的 sink (target)端点:
从 面板的 Components drawer 中拖动另一个文件组件,并将它放到
Route_route1
容器节点上。File 组件会更改为
Route_route1
容器节点内的To_to1
节点。在 canvas 上,选择
To_to1
节点。Properties 视图(位于 canvas 下)显示节点用于编辑的属性字段。
在 Details 标签页中:
-
在 Uri 字段中,键入
file:target/messages/received
。 在 Id 字段中,键入
_Received
。注意这些工具将在运行时创建
target/messages/received
文件夹。
-
在 Uri 字段中,键入
在
Route_route1
容器中,选择 From _from1 节点,并将其连接器箭头( )拖到 To_Received 节点,然后释放它:注意根据路由编辑器的布局方向首选项设置,这两个文件节点已连接并在 canvas 上保持一致。选择为 Down (默认)和 Right。
访问路由编辑器的布局首选项选项:
- 在 Linux 和 Windows 机器上,选择 Windows → Preferences → Fuse Tooling → Editor → 选择图形编辑器的布局方向。
- 在 OS X 上,选择 CodeReady Studio → Preferences → Fuse Tooling → Editor → 选择图表编辑器的布局方向。
注意如果在关闭项目前没有连接节点,工具会在重新打开时自动连接它们。
- 保存 路由。
点击 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 项目:
- 完成 第 2 章 设置您的环境 教程。
下面是其中之一:
完成 第 3 章 定义路由 教程。
或
-
将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint1.xml
文件,如 “关于资源文件”一节 所述。
运行路由
运行路由:
-
打开
ZooOrderApp
项目。 在 Project Explorer 中,选择
ZooOrderApp/Camel Contexts/blueprint.xml
:右键单击
blueprint.xml
,然后选择 Run As → Local Camel Context (不带测试)。注意如果您选择 Local Camel Context,工具会自动尝试针对提供的 JUnit 测试运行路由上下文。由于 JUnit 测试不存在,因此工具将恢复到在没有测试的情况下运行路由上下文。在 第 9 章 使用 JUnit 测试路由 教程中,您可以创建一个 JUnit 测试案例来测试 ZooOrderApp 项目。
Console 面板将打开,以显示反映项目执行进度的日志消息。开始时,Maven 下载更新本地 Maven 存储库所需的资源。Maven 下载过程可能需要几分钟时间。
等待消息(类似于以下内容)显示在输出的末尾。这些消息表示路由成功执行:
... [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
- 要关闭路由,请点击位于 Console 视图顶部的 。
验证路由
要验证路由是否已正确执行,请检查消息 XML 文件是否从源文件夹(src/data
)复制到目标文件夹(target/messages/received
)。
-
在 Project Explorer 中,选择
ZooOrderApp
。 - 右键单击,然后选择 Refresh。
在 Project Explorer 中,找到
target/messages/
文件夹,并将它展开,以验证target/messages/received
文件夹是否包含六个消息文件,message1.xml
到message6.xml
:双击
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 项目:
完成 第 4 章 运行路由 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint1.xml
文件,如 “关于资源文件”一节 所述。
添加和配置基于内容的路由
为您的路由添加并配置基于内容的路由器:
-
在 Project Explorer 中,双击
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
,以在 Editor 视图中打开它。 -
在 Design canvas 上,选择
To_Received
节点,然后选择 trash can 图标来删除它。 在 面板上,打开 Routing drawer,单击 Choice ( )模式,然后在 Design canvas 中点
From_from1
节点。Route_route1
容器会展开,以适应Choice_choice1
节点。错误图标表示Choice_choice1
节点需要您接下来添加的子节点。在 Routing drawer 中,点 When ( )模式,然后在 canvas 中点
Choice_choice1
节点。Choice_choice1
容器扩展以适应When_when1
节点:减少
When_when1
节点表示必须设置一个或多个必要的属性值。注意这些工具可防止您将模式添加到 Route 容器中的无效丢弃点中。
在 canvas 上,选择
When_when1
节点,以在 Properties 视图中打开其属性:- 点 Expression 字段中的 按钮打开可用选项列表。
选择 xpath (用于 XML 查询语言),因为测试消息使用 XML 编写。
注意选择 Expression 语言后,Properties 视图会在 Expression 字段下直接显示其属性。此缩进列表中的 Id 属性设置表达式的 ID。Description 字段后的 Id 属性设置
When
节点的 ID。在缩进 Expression 字段中,type:
/order/orderline/quantity/text ()> 10
此表达式指定,只有 quantity 字段的值大于 10 的消息在路由(到 invalidOrders 文件夹)中传输此路径。
保留每个剩余的属性。
注意Trim 选项(默认启用)从消息中删除任何前导或尾随空格和换行符。
- 保存 路由上下文文件。
点 Source 选项卡查看路由的 XML:
添加和配置日志
对于 ZooOrder 应用程序示例,您可以添加日志消息,以便在通过路由时跟踪 XML 消息。运行路由时,日志消息会出现在 Console 视图中。
按照以下步骤将日志记录添加到 CBR 路由中:
- 在 Design 选项卡中,打开 Components drawer,再点 Log 组件( )。
在 canvas 中,单击
When_when1
节点。When_when1
容器扩展以容纳Log_log1
节点:-
在 canvas 上,选择
Log_log1
节点,以在 Properties 视图中打开其属性。 在 Message 字段中,键入:
请求的数量超过允许的最大值 - 联系客户。
将剩余的属性保留原样。
+
工具自动生成日志节点 id 值。在 Fuse Integration 视角的 Messages 视图中,工具会在 Trace Node Id 列中插入日志节点的 Id 字段的内容,以便在路由上启用追踪时(请参阅 第 8 章 通过路由追踪消息 教程)。在控制台中,每当路由运行时,它会将日志节点的 Message 字段的内容添加到日志数据中。
- 保存 路由上下文文件。
添加和配置消息标头
消息标头包含处理消息的信息。
添加和配置消息标头:
- 在面板中,打开 Transformation drawer,然后单击 Set Header ( )模式。
在 canvas 中,单击
Log_log1
节点。When_when1
容器展开,以适应SetHeader_setHeader1
节点:在 canvas 中,选择
SetHeader_setHeader1
节点,以便在 Properties 视图中打开其属性:- 点 Expression 字段中的 按钮打开可用语言列表,然后选择 constant。
-
在缩进 Expression 字段中,键入
Invalid
。 -
在 Header Name 字段中,键入
Destination
。 将剩余的属性保留原样。
- 在 面板中,打开 Components drawer,然后单击 File ( )组件。
在 canvas 中,点
SetHeader_setHeader1
节点。When_when1
容器展开,以适应To_to1
节点。在 canvas 上,选择
To_to1
节点,以便在 Properties 视图中打开其属性:在 Details 选项卡中,将 directoryName 替换为 Uri 字段中的
target/messages/invalidOrders
,然后在 Id 字段中输入_Invalid
:- 保存 路由上下文文件。
点 Source 选项卡查看路由的 XML:
添加并配置分支来处理有效顺序
目前,CBR 处理包含无效顺序的消息(数量值大于 10 的顺序)。
要添加并配置您的路由分支来处理有效顺序(即,任何与 When_when1 节点设置的 XPath 表达式不匹配的 XML 消息):
- 在面板中,打开 Routing drawer,再点 Otherwise ( )模式。
在 canvas 中,点
Choice_choice1
容器:Choice_choice1
容器扩展,以适应Otherwise_otherwise1
节点。-
在 canvas 上,选择
Otherwise_otherwise1
节点,以便在 Properties 视图中打开其属性。 在 Id 字段中,将
_otherwise1
更改为_elseValid
:
为其他分支配置日志记录:
- 在 面板中,打开 Components drawer,然后单击 Log ( )组件。
在 canvas 中,点
Otherwise_elseValid
节点:otherwise
-elseValid
容器展开,以适应Log_log2
节点。-
在 canvas 上,选择
Log_log2
节点,以便在 Properties 视图中打开其属性。 在 Message 字段中,键入
This is a valid order - OK process。
将剩余的属性保留原样。
- 保存 路由。
为 otherwise 分支配置消息标头:
- 在 面板中,打开 Transformation drawer,然后单击 Set Header pattern。
在 canvas 中,单击
Log_log2
节点。Otherwise_elseValid
容器展开,以适应SetHeader_setHeader2
节点。注意当图表被嵌套时,您可以折叠容器来释放空间。要做到这一点,选择要折叠的容器,然后点击其 按钮:
要重新打开容器,请选择容器,然后点击其 按钮:
在 Design 选项卡中合并和扩展容器不会影响路由上下文文件。它保持不变。
-
在 canvas 上,选择
SetHeader_setHeader2
节点,以便在 Properties 视图中打开其属性。 - 点 Expression 字段中的 按钮打开可用语言列表,然后选择 constant。
-
在缩进 Expression 字段中,键入
ReadyForDispatcher
。 -
在 Header Name 字段中,键入
Destination
。 将剩余的属性保留原样。
为有效信息指定目标文件夹:
- 在 面板中,打开 Components drawer,然后选择 File ( )组件。
在 canvas 中,点
SetHeader_setHeader2
节点。Otherwise_elseValid
容器展开,以适应To_to1
节点。-
在 canvas 上,选择
To_to1
节点,以在 Properties 视图中打开其属性。 在 URI 字段中,将 directoryName 替换为
target/messages/validOrders
,然后在 Id 字段中,键入_Valid
。保存 路由上下文文件。
已完成的基于内容的路由器应如下所示:
点底部的 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() > 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 中的目标目标文件夹:
-
选择
ZooOrderApp
。 - 右键单击它以打开上下文菜单,然后选择 Refresh。
在项目根节点(
ZooOrderApp
)下,找到target/messages/
文件夹并展开它。检查
target/messages/invalidOrders
文件夹是否包含message1.xml
和message3.xml
。在这些消息中,
quantity
元素的值超过 10。检查
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 项目:
完成 第 5 章 添加基于内容的路由器 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint2.xml
文件,如 “关于资源文件”一节 所述。
配置现有路由的端点
现有路由将所有有效的顺序发送到 target/messages/validOrders
文件夹。
在本节中,您要将现有路由的 Otherwise _elseValid 分支的端点重新配置为连接到第二个路由(您在下一节中创建)。
为与第二个路由直接连接配置现有路由:
-
在路由编辑器中打开
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
。 - 在 canvas 上,选择 Route_route1 容器,以在 Properties 视图中打开其属性。
- 向下滚动到 Shutdown Route 属性,然后选择 Default。
- 在 canvas 上,选择终端文件 node To_Valid 以在 Properties 视图中显示其属性。
-
在 Uri 字段中,删除现有文本,然后输入
direct:OrderFulfillment
。 -
在 Id 字段中,输入
_Fulfill
。
您可以将现有的 To_Valid
终端文件节点替换为 Components → Direct 组件,而是将其替换为与 repurposed To_Valid
节点相同的属性值。
要了解有关 Direct 组件的更多信息,请参阅 Apache Camel 组件参考。
添加第二个路由
将另一个路由添加到路由上下文:
- 在 面板中,打开 Routing drawer,然后单击 Route ( )模式。
在 canvas 中,点击
Route_route1
容器右侧:Route 模式成为 canvas 上的
Route_route2
容器节点。-
单击
Route_route2
容器节点,以在 Properties 视图中显示其属性。将属性保留原样。 - 保存文件。
随着路由上下文变得复杂,您可能希望在处理单个路由时将路由编辑器专注于单独的路由。要做到这一点,在 Project Explorer 中,双击您希望路由编辑器在 canvas 上显示的路由;例如 Route_route2
:
要显示 canvas 上路由上下文中的所有路由,请双击 Camel Contexts
文件夹顶部的项目的 .xml
上下文文件条目(src/main/resources/OSGI-INF/…
)。
配置选择分支来处理美国排序
在本小节中,您将 Choice 分支添加到路由,并将路由配置为发送美国订单到 新目标/消息/评估Orders/USA
文件夹。您还设置消息标头和日志文件组件。
- 在 面板中,打开 Components drawer,然后选择 Direct 组件( )。
在 canvas 中,点
Route_route2
容器:Route_route2
容器会展开,以适应 Direct 组件(from_from2
节点):-
在 canvas 上,单击
From_from2
节点,以在 Properties 视图中打开其属性。 在 Uri 字段中,将
name
(followingdirect:
)替换为OrderFulfillment
,然后在 Id 字段中输入_direct:OrderFulfillment
。- 在 面板中,打开 Routing drawer,然后选择 Choice ( )模式。
在 canvas 中,单击
From _direct:OrderFulfillment
节点。Route_route2
容器会展开,以适应Choice_choice2
节点:在 Properties 视图中,保留
Choice_choice2
节点的属性。- 在面板中,打开 Routing drawer,然后选择 When ( )模式。
在 canvas 中,单击
Choice_choice2
节点。Choice_choice2
容器已展开,以适应When_when2
节点。-
在 canvas 上,选择
When_when2
节点,以便在 Properties 视图中打开其属性。 设置
When_when2
节点的属性,如下所示:- 从 Expression 下拉列表中选择 xpath。
-
在缩进 Expression 字段中,键入
/order/customer/country = 'USA'
。 - 保持 Trim enabled。
在第二个 Id 字段中,键入
_when/usa
- 在 面板中,打开 Components drawer,然后选择 File 组件( )。
在 canvas 中,点
When_when/usa
容器。When_when/usa
容器扩展以容纳To_to1
节点。在 Properties 视图中:
-
在 Uri 字段中,将
directoryName
替换为target/messages/validOrders/USA
。 -
在 Id 字段中,键入
_US
。
-
在 Uri 字段中,将
- 保存文件。
要设置消息标头并添加日志组件:
- 在 面板中,打开 Transformation drawer,然后选择 Set Header 模式。
在 canvas 中,点
When_when/usa
节点。When_when/usa
容器扩展以适应SetHeader_setHeader3
节点:-
在 canvas 上,选择
SetHeader_setHeader3
节点,以便在 Properties 视图中打开其属性。 设置节点的属性,如下所示:
- 在 Expression 下拉菜单中选择 constant。
-
在缩进 Expression 字段中,键入:
USA
- 保持 Trim enabled。
-
在 Header Name 字段中,输入:
Destination
在第二个 Id 字段中,键入:
_setHead_usa
- 在 面板中,打开 Components drawer,然后选择 Log 组件( )。
在 canvas 中,点
SetHeader
node。When_when/usa
容器扩展以适应Log_log3
节点。在 canvas 上,选择
Log_log3
节点在 Properties 视图中打开其属性:在 Properties 视图中:
-
在 Message 字段中,键入
Valid order - 向美国客户发运的 aimals
。 -
在 Id 字段中,键入
_usa
。 将 日志记录级别 保留原样。
-
在 Message 字段中,键入
保存文件。
Route_route2
美国分支应如下所示:
配置其它分支来处理德国订购
在 canvas 上显示 Route_route2
时:
- 在 面板中,打开 Routing drawer,然后选择 Otherwise pattern ( )。
在 canvas 中,单击
Choice_choice2
容器。Choice_choice2
容器扩展以适应Otherwise_otherwise1
节点。-
选择
Otherwise_otherwise1
节点,以便在 Properties 视图中打开其属性。 -
在 Properties 视图中,为 Id 字段输入
_else/ger
。 - 在面板中,打开 Transformation drawer,然后选择 Set Header pattern ( )。
在 canvas 中,点
Otherwise_else/ger
节点。Otherwise_else/ger
容器会展开,以适应SetHeader_setHeader3
节点。-
在 canvas 上,选择
SetHeader_setHeader3
节点,以便在 Properties 视图中打开其属性。 在 Properties 视图中:
- 从 Expression 下拉列表中,选择 constant。
-
在第二个 Expression 字段中,键入
Germany
。 - 将 Trim 保留为.
-
在 Header Name 字段中,键入
Destination
。 -
在第二个 Id 字段中,键入
_setHead_ger
。
- 在 面板中,打开 Components drawer,然后选择 Log pattern ( )。
在 canvas 中,单击
SetHeader_setHead_ger
节点下方。otherwise
_else/ger
容器会展开,以适应Log_log3
节点。如果需要,将连接器错误从Log_log3
节点拖到SetHeader_setHead_ger
节点:-
在 canvas 上,选择
Log_log3
节点,以在 Properties 视图中打开其属性。 在 Properties 视图中:
-
在 Message 字段中,键入
Valid order - 向德国客户提供imals
。 -
在 Id 字段中,键入
_ger
。 - 将 日志记录级别 保留原样。
-
在 Message 字段中,键入
在 Components drawer 中,选择一个 File pattern ( ),然后点击
Log_ger
节点。otherwise
_else/ger
容器会展开,以适应To_to1
节点。如果需要,将连接器错误从SetHeader_setHead_ger
节点拖到To_to1
节点:-
在 canvas 上,选择
To_to1
节点,以在 Properties 视图中打开其属性。 在 Properties 视图中:
-
在 Uri 字段中,将
directoryName
替换为target/messages/validOrders/Germany
-
在 Id 字段中,键入
_GER
。
-
在 Uri 字段中,将
- 保存文件。
Route_route2
的德国分支应如下所示:
验证第二个路由
canvas 上的路由应如下所示:
completed route1
已完成的 route2
在 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() > 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
项目可能无法运行。
要确保更新的项目按预期工作,请按照以下步骤执行:
-
将
ZooOrderApp/Camel Contexts/blueprint.xml
作为本地 Camel 上下文运行(无需测试)。 检查控制台输出的末尾。您应该看到这些行:
检查目标目标文件夹以验证路由是否已正确执行:
-
在 Project Explorer 中,右键单击
ZooOrderApp
,然后选择 Refresh。 展开
target/messages/
文件夹。message*.xml
文件应该分散在目的地,如下所示:图 6.1. Project Explorer 中的目标消息目的地
-
在 Project Explorer 中,右键单击
后续步骤
在下一个教程 第 7 章 调试路由上下文 中,您将了解如何使用 Fuse 工具调试器。
第 7 章 调试路由上下文
本教程介绍了如何使用 Camel 调试器查找本地运行路由上下文的逻辑错误。
目标
在本教程中,您将完成以下任务:
- 在两个路由中感兴趣的节点上设置断点
- 在 Debug 视角中,逐步浏览路由并检查消息变量的值
- 再次逐步浏览路由,更改消息变量的值并观察其效果
先决条件
要启动此教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 6 章 将另一个路由添加到路由上下文 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint3.xml
文件,如 “关于资源文件”一节 所述。
设置断点
在 Debugger 中,您可以设置条件和无条件的断点。在本教程中,您只设置无条件断点。要了解如何设置条件断点(在调试会话中满足特定条件时触发),请参阅 工具用户指南。
设置无条件断点:
-
如有必要,请在路由编辑器中打开
ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
。 -
在 Project Explorer 中,展开
Camel Contexts
→src/main/resources/OSGI-INF/blueprint/blueprint.xml
,以公开这两个路由条目。 -
在 Design 选项卡中,双击 Route_route1 条目,将重点切换到
Route_route1
。 在 canvas 中,选择
Choice_choice1
节点,然后点 图标设置无条件断点:注意在路由编辑器中,您可以通过点击节点的 图标或其 图标来禁用或删除特定的断点。您可以通过右键单击 canvas 并选择 Delete all breakpoints 来删除所有设置断点。
在以下
Route_Route1
节点上设置无条件断点:-
Log_log1
-
SetHeader_setHeader1
-
To_Invalid
-
Log_log2
-
SetHeader_setHeader2
-
To_Fulfill
-
-
在 Project Explorer 中,双击
src/main/resources/OSGI-INF/blueprint
下的Route_route2
,以在 canvas 上打开Route_route2
。 在以下
Route_Route2
节点上设置无条件断点:-
Choice_choice2
-
SetHeader_setHead_usa
-
Log_usa
-
To_US
-
SetHeader_setHead_ger
-
Log_ger
-
To_GER
-
逐步浏览路由上下文
您可以通过两种方式逐步完成路由上下文:
- Step over ( )- 转至路由上下文中的下一个执行节点,而不考虑断点。
恢复( )- 在路由上下文中转至下一个活跃断点。
-
在 Project Explorer 中,展开
ZooOrderApp
项目的Camel Contexts
文件夹,以公开blueprint.xml
文件。 右键单击
blueprint.xml
文件以打开其上下文菜单,然后单击 Debug As → Local Camel Context (无需测试)。Camel 调试器会在遇到的第一个断点挂起执行,并询问您现在是否要打开 Debug 透视图:
单击 Yes 。
注意如果您单击 No,则确认窗格会出现多次。第三个引用后,它会消失,Camel 调试器恢复执行。此时要与调试器交互,您需要通过点击 Window → Open Perspective → > Debug 来打开 Debug 透视图。
Debug 视角会打开,并显示在
_route1 [blueprint.xml] 中的 _choice1
暂停的路由上下文,如 Debug 视图所示:注意断点在调试器自动恢复前最多需要五分钟,进入下一个断点或进入路由上下文的末尾(以下一点为准)。
在 Variables 视图中,展开节点以公开每个节点的变量和值。
当您完成路由上下文时,自上色中突出显示了最后一个断点后,其值已更改的变量。您可能需要在每个断点扩展节点,以显示已更改的变量。
点 进入下一个断点,
_log2 in _route1 [blueprint.xml]
:-
展开 Variables 视图中的节点,以检查
Route1 [blueprintxt.xml] 中最后一个断点(位于 _choice
1)后更改的变量。 点 进入下一个断点
_setHeader2 in Route1 [blueprint.xml]
。检查更改的变量(高亮),因为
Route1 [blueprint.xml] 中的断点是 _log2
。在 Debug 视图中,单击
_route1 [blueprint.xml] 中的 _log2
,以使用_route1 [blueprint.xml] 中的 breakpoint _log2 中的
变量值填充变量视图。在 Debug 视图中,您可以在同一个消息流中的断点间切换,以快速比较和监控 Variables 视图中的变量值。
注意消息流的长度可能会有所不同。对于传输
Route_route1
的InvalidOrders
分支的消息,消息流会比较短。对于传输Route_route1
的ValidOrders
分支的消息,其继续到Route_route2
,消息流越长。继续逐步浏览路由上下文。当一个消息完成路由上下文,下一个消息进入它时,新消息流会出现在 Debug 视图中,带有新的面包表 ID:
在这种情况下,
ID-janemurpheysmbp-home-55846-1471374645179-0-3
标识第二个消息流,对应于message2.xml
已进入路由上下文。面包屑导航栏 ID 由 2 递增。注意交换和消息 ID 相同,并在消息传递上下文期间保持不变。其 ID 由消息流的面包 ID 组成,并由 1 递增。因此,在
message2.xml
中,其ExchangeId
和MessageId
是ID-janemurpheysmbp-home-55846-1471374645179-0-4
。当
message3.xml
进入_route_route1 [blueprint.xml] 中的断点 _choice1
时,检查 Processor 变量。显示的值是为message1.xml
和message2.xml
累计的指标,之前传输了路由上下文:时间指标以毫秒为单位。
-
通过路由上下文继续逐步执行每个消息,检查每个处理步骤中的变量和控制台输出。当
message6.xml
在Route2 [blueprint.xml] 中输入断点 To_GER
时,调试器开始关闭面包屑线程。 在 Menu 栏中,点 终止 Camel 调试器。控制台终止,但您必须手动清除输出。
注意在 Debug 视图中的 Camel Context node 下选择线程或端点时,您必须点击 两次 - 首先终止线程或端点,第二次终止 Camel 上下文,因此会话。
在 Menu 栏中,右键单击 以打开上下文菜单,然后选择 Close 关闭 Debug perspective。
CodeReady Studio 会自动返回到启动 Camel 调试器的视角。
在 Project Explorer 中,右键单击项目,然后选择 Refresh 以刷新显示。
注意如果您预先终止会话,在传输路由上下文之前,您可能会看到
ZooOrderApp/src/data
文件夹下的信息,如下所示:message3.xml.camelLock
。您需要移除它,然后才能在项目上运行调试器。为此,请双击.camelLock
消息以打开其上下文菜单,然后选择 Delete。当被提示时,单击 OK 以确认删除。扩展
ZooOrderApp/target/messages/
目录,以检查消息是否已传送到预期的目的地:
-
在 Project Explorer 中,展开
路由上下文保留原样,并设置并启用所有断点。
更改变量的值
在本节中,您将变量添加到监视列表中,以方便地检查它们的值在消息通过路由上下文时如何改变。您可以更改消息正文中的变量的值,然后观察更改如何通过路由上下文影响消息的路由。
-
要在
ZooOrderApp
项目中重新运行 Camel 调试器,请右键单击blueprint.xml
文件,然后点 Debug As → Local Camel Context (没有测试)。 由于
message1
在第一个断点上停止,_choice1 在 _route1 [blueprint.xml]
中停止,将变量NodeId
和RouteId
(在Exchange
类别中)和MessageBody
和CamelFileName
(在Message
类别中)添加到 watch 列表中。对于每个四个变量:
- 在 Variables 视图中,展开适当的类别以公开 target 变量:
在变量(本例中为
NodeId
)打开上下文菜单并选择 Watch:Expressions 选项卡将打开,列出您选择的要监视的变量:
注意创建监视列表可让您轻松检查感兴趣的多个变量的当前值。
-
步骤
message1
到路由上下文,直到达到第四个断点,_Fulfill in _route1 [blueprint.xml]
. -
在 Variables 视图中,展开
Message
类别。 将变量
Destination
添加到 watch 列表中。Expressions 视图现在应包含这些变量:
注意- 变量列表下面的窗格显示所选变量的值。
- Expressions 视图保留添加到列表中的所有变量,直到您明确删除它们。
-
第
message1
步到路由上下文的其余部分,然后逐步执行消息2
。 -
在
_route1 [blueprint.xml] 中停止
。message3
at _choice1 -
在 Variables 视图中,展开
Message
category 以公开MessageBody
变量。 右键单击
MessageBody
以打开其上下文菜单,然后选择 更改值 :将
quantity
的值从 15 改为 10 (将其从无效顺序更改为有效顺序):这只更改内存值(不编辑
message3.xml
文件)。- 点击 确定。
切换到 Expressions 视图,然后选择
MessageBody
变量。变量列表下面的窗格显示
message3
的完整正文,从而可以轻松地检查顺序项目的当前值:点 进入下一步。
message3
现在遵循导致To_Fulfill
和Route_route2
的分支,而不是跟随To_Invalid
的分支。
缩小 Camel 调试器的重点范围
您可以临时缩小,然后通过禁用和重新启用断点来重新增加调试器的重点:
-
Step
message4
through routing context, check the Debug view, Variables view, and the Console output at the step. -
在
_route1 [blueprint.xml] 中停止
)。消息4
(位于 _choice1 切换到 Breakpoints 视图,然后清除下面
_choice1
下列出的断点旁的每个复选框。清除断点的复选框会临时禁用它。点 进入下一个断点:
debugger 在禁用的断点上跳过,并跳转到
_route1 [blueprint.xml] 中的 _FulFill
。再次点 进入下一个断点:
debugger 在
_route2 [blueprint.xml] 中跳到 _GER
。-
重复点
,通过路由上下文快速步骤
message5
和message6
。 - 切换到 Breakpoints 视图,并选中所有断点旁边的框来重新启用它们。
验证更改消息变量值的影响
停止调试器并检查更改 'message1's quantity 变量的值的结果:
在工具栏中,点 终止 Camel 调试器:
- 点击控制台的 按钮清除输出。
- 关闭 Debug 透视图,再返回到启动 Camel 调试器的视角。
- 在 Project Explorer 中,刷新显示。
扩展
ZooOrderApp/target/messages/
目录,以检查消息是否如预期发送:您应该会看到
message1
只发送到invalidOrders
,并且message3.xml
出现在validOrders/Germany
文件夹中。
后续步骤
在 第 8 章 通过路由追踪消息 教程中,您可以通过路由上下文跟踪信息,以确定您可以优化并微调路由上下文的性能。
第 8 章 通过路由追踪消息
通过追踪,您可以截获消息,因为它从一个节点路由到另一个节点。您可以通过路由上下文跟踪消息,以查看您可以优化和微调路由上下文性能的位置。本教程介绍了如何通过路由跟踪消息。
目标
在本教程中,您将完成以下任务:
-
在 Fuse Integration 视角中运行
ZooOrderApp
-
在
ZooOrderApp
上启用追踪 -
将消息放到
ZooOrderApp
上,并通过所有路由节点跟踪它们
先决条件
要启动此教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 6 章 将另一个路由添加到路由上下文 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint3.xml
文件,如 “关于资源文件”一节 所述。
设置 Fuse 集成视角
设置工作区以便于消息追踪:
点击工具栏右侧的 按钮,然后从列表中选择 Fuse Integration :
Fuse Integration 视角在默认布局中打开:
将 JMX Navigator 选项卡拖到 Terminal 选项卡的最右侧,并将它放到其中:
此安排提供了更多空间,以便诊断路由上下文的节点以图形方式显示路由上下文的节点,从而可以更轻松地查看消息遍历路由上下文的路径。
注意为了便于访问路由上下文
.xml
文件,特别是当项目由多个上下文组成时,工具会在 Project Explorer 中的Camel Contexts
文件夹下列出它们。另外,路由上下文中的所有路由都直接显示为其上下文文件条目下的图标。要在 canvas 上的路由上下文中显示单个路由,请双击 Project Explorer 中的图标。要在路由上下文中显示所有路由,请双击上下文文件条目。
开始消息追踪
在 ZooOrderApp
项目中启动消息追踪:
-
在 Project Explorer 中,展开
ZooOrderApp
项目,以公开src/main/resources/OSGI-INF/blueprint/blueprint.xml
。 -
右键单击
src/main/resources/OSGI-INF/blueprint/blueprint.xml
以打开上下文菜单。 选择 Run As → Local Camel Context (不带测试)。
注意如果您选择 Local Camel Context,工具会恢复到在没有测试的情况下运行,因为还没有为
ZooOrderApp
项目创建了 JUnit 测试。稍后您将在 第 9 章 使用 JUnit 测试路由 中执行此操作。在 JMX Navigator 中,展开
本地进程
。-
右键单击
maven [ID]
节点,然后选择 连接。 扩展路由的元素:
右键点击
Routes
节点,然后选择 Start Tracing :该工具在图表视图中显示您的路由上下文 的图形表示 :
要明确查看所有消息流路径,您可能需要在 图表 视图选项卡中拖动节点来重新安排节点。您可能还需要调整 Red Hat CodeReady Studio 中其他视图和标签页的大小,以允许 Diagram View 选项卡扩展。
在运行的 ZooOrderApp 项目中丢弃消息
丢弃正在运行的 ZooOrderApp 项目中的消息:
在 Project Explorer 中,展开
ZooOrderApp/src/data
,以便您可以访问消息文件(message1.xml
通过message6.xml
):Drag
message1.xml
将其放到_context1>Endpoints>file>src/data?noop=true
节点上:当消息会遍历路由时,工具追踪并记录其传递。
配置消息视图
您必须在显示消息追踪前刷新 Messages View。如果您希望它们在所有消息跟踪中保留,您还需要在 Messages View 中配置列。
- 打开 Messages 视图。
-
点击顶部的
(Refresh 按钮),在面板菜单栏的右侧使用
message1.xml
信息跟踪填充视图。 点面板菜单栏中的 图标,然后选择 Configure Columns 以打开 Configure Columns 向导:
注意请注意,您在路由上下文中为消息设置的消息标头 Destination 会出现在列表中。
您可以通过选择或取消选择 消息视图 来包含或排除它们。您可以通过突出显示个别、选定项目并在列表中移动它们,重新安排在 Messages View 中出现的列号顺序。
在 Configure Columns 向导中,以这种方式选择并排序列:
这些列及其顺序将保留在 消息视图中, 直到您再次更改它们。
您可以在所有工具的表中控制列布局。使用拖动方法临时重新安排表格格式。例如,拖动列的边框规则以扩展或合同其宽度。要隐藏一个列,总计合约其边框。拖动列标题以重新定位表中的列。要保留您的安排,您必须使用 View → Configure Columns 方法。
逐步浏览消息追踪
逐步浏览消息跟踪:
-
拖动
message2.xml
并将其放到_context1>Endpoints>file>src/data?noop=true
节点上,保存在 JMX Navigator 中。 - 从 Console 切换到 Messages 视图。
在 Messages View 中,点 (刷新按钮)使用
message2.xml
消息跟踪填充视图。每次丢弃 JMX Navigator 中的消息时,您需要刷新 Messages View 以填充消息跟踪。
点击其中一个信息跟踪在 Properties 视图中查看它的更多详情:
该工具在 Properties 视图中显示消息跟踪(包括消息标头)的详细信息,以及 Properties 视图下半消息实例的内容。因此,如果您的应用程序在路由中的任何步骤中设置了标头,您可以检查 Message Details 以查看它们是否如预期设置。
您可以通过突出显示消息实例来逐步浏览消息实例,以查看特定消息如何遍历路由,以及路由中每个步骤是否按预期处理。
打开 Diagram View 以查看路由中的相关步骤已突出显示:
这些工具以 图表 视图中提取路由,标记路径退出处理步骤,包含时间和性能指标(以毫秒为单位)。图中仅显示 指标 Total Exchange。
将鼠标指针悬停在显示的指标上,以显示有关消息流的额外指标:
- 平均处理消息的步骤所需时间
- 处理消息步骤的最长时间
- 处理消息的最短时间
另外,您可以随时将
ZooOrderApp/src/data/
中的其余消息拖放到_context1>Endpoints>file>src/data?noop=true
节点(只要仍然启用追踪)。在每个后续丢弃中,请记住点 (刷新按钮)使用新消息跟踪填充 Messages View。
完成后:
-
在 JMX Navigator 中,右键单击
_context1
并选择 Stop Tracing Context。 - 打开控制台 并点击面板右上角的 按钮停止控制台。然后点击 按钮清除控制台输出。
-
在 JMX Navigator 中,右键单击
后续步骤
在 第 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
- 观察输出
先决条件
要启动此教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 8 章 通过路由追踪消息 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint3.xml
文件,如 “关于资源文件”一节 所述。
从 Project Explorer 中的
ZooOrderApp
项目的/src/data/
目录和/target/messages/
子目录中删除任何 trace 生成的消息。跟踪生成的消息以ID-
前缀开头。例如,图 9.1 “跟踪生成的消息” 显示八个 trace 生成的信息:图 9.1. 跟踪生成的消息
选择批处理中的所有 trace 生成的消息,右键单击并选择 Delete。
创建 src/test
文件夹
在为 ZooOrderApp
项目创建 JUnit 测试案例前,您必须为它创建一个包含在构建路径中的文件夹:
-
在 Project Explorer 中,右键单击
ZooOrderApp
项目,然后选择 New → Folder。 在 New Folder 对话框中,在项目树窗格中,展开
ZooOrderApp
节点并选择src
文件夹。确保
ZooOrderApp/src
出现在 Enter 或选择 parent folder 字段中。在 Folder name 中,输入
/test/java
:点 Finish。
在 Project Explorer 中,新的
src/test/java
文件夹会出现在src/main/resources
文件夹下:验证构建路径中是否包含新的
/src/test/java
文件夹。-
在 Project Explorer 中,右键单击
/src/test/java
文件夹以打开上下文菜单。 选择 Build Path 以查看菜单选项:
菜单选项 Remove from Build Path 验证构建路径中当前是否包含
/src/test/java
文件夹:
-
在 Project Explorer 中,右键单击
创建 JUnit 测试案例
为 ZooOrderApp
项目创建一个 JUnit 测试案例:
-
在 Project Explorer 中,选择
src/test/java
。 右键单击,然后选择 New → Camel Test Case。
-
在 Camel JUnit Test Case 向导中,确保
Source folder
字段包含ZooOrderApp/src/test/java
。要找到正确的文件夹,请点击 。 -
在 Package 字段中,输入
tutorial.zooapp.route
。此软件包将包括新的测试案例。 在 test 字段下的 Camel XML 文件中,点 打开配置为过滤 XML 文件的文件 explorer,然后选择
ZooOrderApp
项目的blueprint.xml
文件:点击 确定。Name 字段默认为 BlueprintXmlTest。
点 Next 打开 Test Endpoints 页面。
默认情况下,会选择所有端点,并将包含在测试案例中。
点 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
文件:
在 Project Explorer 中,展开
ZooOrderApp
项目,以公开BlueprintXmlTest.java
文件:-
打开
BlueprintXmlTest.java
文件。 -
在 Java 编辑器中,单击
import org.apache.camel.EndpointInject;
以展开列表。 添加以粗体文本显示的两行。添加第一行会导致在更新
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;
-
向下滚动到在
// Expected 消息正文
后直接遵循的行。 使用这些
受保护的
行: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;
向下滚动到行
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");
-
向下滚动到
// TODO Ensure expectations 之后直接遵循的行,对我们测试的路由有意义
。 将以
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);
其余的代码保留原样。
- 保存该文件。
检查您更新的
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
文件中:
-
在 Project Explorer 中,选择位于目标文件夹下的
pom.xml
,然后在工具的 XML 编辑器中打开它。 -
单击页面底部的
pom.xml
选项卡,以打开文件进行编辑。 在 <
dependencies>
部分的末尾添加以下行:<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> <scope>test</scope> </dependency>
- 保存该文件。
运行 JUnit 测试
要运行测试:
- 切换到 JBoss 透视图以释放更多工作区。
-
在 Project Explorer 中,右键单击
ZooOrderApp
项目。 选择 Run As → JUnit Test。
默认情况下,JUnit 视图在边栏中打开。(为了提供更好的视图,请将其拖动到底部,右侧面板显示 控制台、服务器和 属性 选项卡。)
注意有时,测试在第一次在项目上运行 JUnit 时失败。重新运行测试会导致成功的结果。
如果测试成功运行,您会看到如下内容:
图 9.2. 成功运行 JUnit
当测试失败时,您会看到如下内容:
图 9.3. 失败的 JUnit 运行
注意如果您的执行环境没有设置为 Java SE 8,则 JUnit 将失败。JUnit 选项卡顶部的消息栏将显示一条错误消息,表示它无法找到正确的 SDK。
要解决这个问题,打开项目的上下文菜单,然后选择 Run As → Run Configuration → JRE。点 *Execution environment 字段旁边的 Environments] 按钮,找到并选择 Java SE 8 环境。
检查输出并采取措施解决任何测试失败。
要查看 JUnit 面板中显示的更多错误,请点面板菜单栏中的 来最大化视图。
再次运行 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 实例
- 在您的计算机上安装了 Java 8
ZooOrderApp 项目由以下之一生成:
完成 第 9 章 使用 JUnit 测试路由 教程。
或
-
完成 第 2 章 设置您的环境 教程,并将项目的
blueprint.xml
文件替换为提供的blueprintContexts/blueprint3.xml
文件,如 “关于资源文件”一节 所述。
定义 Red Hat Fuse Server
定义服务器:
- 打开 Fuse Integration 视角。
- 单击右下角的 Servers 选项卡,以打开 Servers 视图。
点 No servers are available.点击此链接来创建新 server… 链接,以打开 Define a New Server 页面。
注意要在已经定义新的服务器时定义新的服务器,请在 Servers 视图中右键单击,然后选择 New → Server。
扩展 Red Hat JBoss Middleware 节点以公开可用的服务器选项:
- 选择红帽 Fuse 服务器。
接受 服务器主机名(localhost)和 服务器名称 (Fuse n.n Runtime Server)的默认值,然后点 Next 打开 Runtime 页面:
注意如果您还没有安装 Fuse,则可以使用 Download and install runtime 链接下载它。
如果您已经定义了服务器,工具会跳过此页面,而是显示配置详情页面。
- 接受 Name 的默认值。
- 单击 Home Directory 字段旁边的 Browse,以导航到安装并选择它。
从 Execution Environment 旁边的下拉菜单中选择运行时 JRE。
选择 JavaSE-1.8 (推荐)。如有必要,点 Environments 按钮从列表中选择它。
注意Fuse 服务器需要 Java 8 (推荐)。要为 执行环境选择它,您必须已安装了它。
- 将 Alternate JRE 选项保留原样。
点 Next 保存 Fuse Server 的运行时定义,并打开 Fuse 服务器配置详情页面 :
接受 SSH 端口 的默认端口(8101)。
运行时使用 SSH 端口来连接服务器的 Karaf shell。如果此默认是不正确的,您可以通过查看 Red Hat Fuse
installDir/etc/org.apache.karaf.shell.cfg
文件来发现正确的端口号。在 User Name 中,输入用于登录到服务器的名称。
这是存储在 Red Hat Fuse installDir'/etc/users.properties' 文件中的用户名。
注意如果在
/etc/users.properties
文件中激活了默认用户(未提供),工具会使用默认用户名和密码自动填充用户名和密码。如果还没有设置,您可以使用
user=password,role
(如joe=secret,Administrator
)格式向该文件添加一个,也可以使用 karafjaas
命令设置它:-
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
命令来发现用户名。
-
在 Password 中,键入用户名登录 服务器所需的密码。
这是在 Red Hat Fuse 的
installDir/etc/users.properties
文件中或 karafjaas
命令中设置的密码。点 Finish。
运行时服务器 [stopped, Synchronized] 会出现在 Servers 视图中。
在 Servers 视图中,展开 Runtime Server:
JMX[Disconnected] 在 Runtime Server [stopped, Synchronized] 条目下显示为节点。
配置发布选项
使用发布选项,您可以配置 ZooOrderApp 项目如何以及何时将 ZooOrderApp
项目发布到正在运行的服务器:
- 在保存对项目所做的更改时,立即自动执行
- 在更改并保存项目后,自动配置间隔
- 手动,当您选择 publish 操作时
在本教程中,您可以在保存对 ZooOrderApp
项目的更改时配置立即发布。要做到这一点:
- 在 Servers 视图中,双击 Runtime Server [stopped, Synchronized] 条目来显示其概述。
在服务器的 Overview 页面中,展开 Publishing 部分以公开选项。
确保启用了 资源更改时 Automatically publish publish 选项。
(可选)更改 Publishing interval 的值,以便在进行更改时加快或延迟发布项目。
- 在 Servers 视图中,点 。
等待几秒钟,使服务器启动。当它有时:
Terminal 视图显示 splash 屏幕:
Servers 视图显示:
JMX Navigator 显示 n.n Runtime Server[Disconnected:
在 Servers 视图中,右键单击 n.n Runtime Server [Started],然后选择 Add and Remove 打开 Add and Remove 页面:
确保 选项 如果启动了 server,则将立即检查发布更改。
选择
ZooOrderApp
并点 Add 来将其分配给 Fuse 服务器:点 Finish。
Servers 视图应该显示以下内容:
运行时服务器 [Started, Synchronized]
注意对于服务器,同步 意味着服务器上发布的所有模块都与其本地对应的模块相同。
ZooOrderApp [Started, Synchronized]
注意对于模块 同步,sync 表示已发布的模块与其本地对应的模块相同。因为启用自动发布,所以对 ZooOrderApp 项目所做的更改会按秒发布(根据出 间隔的值)。
- JMX[断开连接]
连接到运行时服务器
连接到运行时服务器后,您可以看到 ZooOrderApp
项目的已发布的元素并与它们交互。
- 在 Servers 视图中,双击 JMX[Disconnected] 以连接到运行时服务器。
在 JMX Navigator 中,展开
Camel
文件夹以公开ZooOrderApp
的元素。点 Bundles 节点,使用运行时服务器上安装的捆绑包列表填充 Properties 视图:
在 Search 字段中,键入 ZooOrderApp。此时会显示对应的捆绑包:
注意或者,您可以在 Terminal 视图中发出
osgi:list
命令,以查看在服务器运行时上安装的生成的捆绑包列表。该工具为osgi:list
命令显示的 OSGi 捆绑包使用不同的命名方案。在这种情况下,命令会返回Camel Blueprint Quickstart
,显示在已安装的捆绑包列表的末尾。在项目的
pom.xml
文件的 <build
> 部分中,您可以找到maven-bundle-plugin
条目中列出的捆绑包符号名称及其捆绑包名称(OSGi):
卸载 ZooOrderApp 项目
您不需要断开 JMX 连接或停止服务器来卸载已发布的资源。
从运行时服务器中删除 ZooOrderApp
资源:
- 在 Servers 视图中,右键单击 n.n Runtime Server 以打开上下文菜单。
选择 Add and Remove:
-
在 Configured 列中,选择
ZooOrderApp
,然后单击 Remove 将ZooOrderApp
资源移到 Available 列中。 - 点 Finish。
在 Servers 视图中,右键单击 JMX[Connected],然后单击 Refresh。
JMX[Connected] 下的
Camel
树会消失。注意在 JMX Navigator 中,Server Connections > n.n Runtime Server[Connected] 下的
Camel
树也会消失。- 在 Properties 视图中显示的 Bundles 页面时,向下滚动到列表的末尾,以验证 ZooOrderApp 的捆绑包不再被列出。