第 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 AsLocal 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 AsLocal 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 章 通过路由追踪消息 教程中,您可以通过路由上下文跟踪信息,以确定您可以优化并微调路由上下文的性能。