第 7 章 调试路由上下文
本教程介绍了如何使用 Camel 调试器查找本地运行路由上下文的逻辑错误。
目标
在本教程中,您将完成以下任务:
- 在两个路由中感兴趣的节点上设置断点
- 在 Debug 透视图中,逐步浏览路由并检查消息变量的值
- 再次逐步浏览路由,更改消息变量的值并观察其效果
先决条件
要启动本教程,您需要从以下之一生成的 ZooOrderApp 项目:
完成 第 6 章 在路由上下文中添加另一个路由 教程。
or
-
完成 第 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
以公开这两个路由条目。 -
双击 Route_route1 条目,在 Design 选项卡中将重点切换为
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
-
OT_US
-
SetHeader_setHead_ger
-
Log_ger
-
OT_GER
-
逐步浏览路由上下文
您可以通过两种方式逐步浏览路由上下文:
-
Step over (
)- 无论断点是什么,都恢复到路由上下文中的下一个执行节点。
resume (
)- 跳到路由上下文中的下一个活跃断点。
-
在 Project Explorer 中,展开
ZooOrderApp
项目的Camel Contexts
文件夹,以公开blueprint.xml
文件。 右键单击
blueprint.xml
文件以打开其上下文菜单,然后点击 Debug AsLocal Camel Context (不带测试)。 Camel debugger 会在它遇到的第一个断点挂起执行,并询问您是否要打开 Debug 视角:
单击 Yes 。
注意如果您单击 No,则确认窗格会出现多次。在第三个 refusal 后,它会消失,Camel debugger 会恢复执行。要与调试器交互,您需要通过点 Window
Open Perspective > Debug 来打开 Debug 视角。 Debug perspective 将打开,其路由上下文在
_route1 [blueprint.xml] 中的 _choice1
中暂停,如 Debug 视图中所示:注意断点在调试器自动恢复前最多需要五分钟,移至下一个断点或路由上下文的末尾(以下一步为准)。
在 Variables 视图中,扩展节点以公开每个节点的可用变量和值。
当您逐步执行路由上下文时,其值自上次断点以黄色突出显示时所更改的变量。您可能需要扩展每个断点的节点,以显示已更改的变量。
点
进入下一个断点
_log2 in _route1 [blueprint.xml]
:-
展开 Variables 视图中的节点,以检查自
Route1 [blueprintxt.xml] 中 _choice1
的最后一个断点后更改的变量。 点
进入下一个断点
_setHeader2 [blueprint.xml]
。检查自
Route1 [blueprint.xml] 中 _log2 的
断点以来更改的变量(高亮)。在 Debug 视图中,单击
_route1 [blueprint.xml] 中的 _log2
,以使用_route1 [blueprint.xml] 中的 breakpoint _log2 中的
变量值填充 Variables 视图。在 Debug 视图中,您可以在同一消息流中的断点间切换,以快速比较和监控 Variables 视图中的变量值。
注意消息流的长度可能会有所不同。对于传输
Route_route1
的InvalidOrders
分支的消息,消息流是短的。对于传输Route_route1
分支(继续到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] 中输入 breakpoint _choice1 时
,检查 Processor 变量。显示的值是message1.xml
和message2.xml
的总指标,之前传输了路由上下文:计时指标以毫秒为单位。
-
继续通过路由上下文逐步执行每个消息,检查每个处理步骤的变量和控制台输出。当
message6.xml
在Route2 [blueprint.xml] 中输入 breakpoint To_GER
时,调试器开始关闭面包屑导航栏线程。 在菜单栏中,点
终止 Camel 调试器。控制台会终止,但您必须手动清除输出。
注意在 Debug 视图中的 Camel Context 节点下选择了线程或端点时,您必须点
两次 - 来终止线程或端点,第二个用于终止 Camel 上下文,因此会话。
在 Menu 栏中,右键单击
以打开上下文菜单,然后选择 Close 以关闭 Debug 视角。
CodeReady Studio 会自动返回到您启动 Camel 调试器的视角。
在 Project Explorer 中,右键单击项目,然后选择 Refresh 以刷新显示。
注意如果您预先终止会话,在传输路由上下文的所有消息之前,您可能会在
ZooOrderApp/src/data
文件夹下看到,如下所示:message3.xml.camelLock
。您需要将它移除,然后对项目再次运行 debugger。为此,请双击.camelLock
消息打开其上下文菜单,然后选择 Delete。当被要求时,单击 OK 以确认删除。扩展
ZooOrderApp/target/messages/
目录,以检查消息是否已发送到其预期的目的地:
-
在 Project Explorer 中,展开
将路由上下文保留原样,且所有断点都设置并启用。
更改变量的值
在本节中,您将变量添加到监视列表中,以便轻松检查其值在通过路由上下文时如何改变。您可以更改消息正文中的变量的值,然后观察更改如何通过路由上下文影响消息路由。
-
要在
ZooOrderApp
项目上重新运行 Camel debugger,请右键单击blueprint.xml
文件,然后单击 Debug AsLocal Camel Context (没有测试)。 在第一个断点上停止了
message1
,在 _route1 [blueprint.xml] 中
停止 _choice1,将变量NodeId
和RouteId
(在Exchange
category 中)和MessageBody
和CamelFileName
(在Message
类别中)添加到监视列表中。对于每个变量:
- 在 Variables 视图中,扩展适当的类别来公开目标变量:
右键点击变量(本例中为
NodeId
),以打开上下文菜单并选择 Watch :Expressions 选项卡将打开,列出您选择的要监视的变量:
注意通过创建监视列表,您可以轻松检查感兴趣的多个变量的当前值。
-
通过路由上下文的第
message1
步,直到到达_route1 [blueprint.xml] 中的第四个断点 _Fulfill
。 -
在 Variables 视图中,展开
Message
类别。 将变量
Destination
添加到 watch 列表中。Expressions 视图现在应包含这些变量:
注意- 变量列表下的窗格显示所选变量的值。
- Expressions 视图会保留添加到列表中的所有变量,直到您明确删除它们。
-
步骤
message1
通过路由上下文的其余部分,然后逐步消息2
所有方法。 -
在
_route1 [blueprint.xml] 中的 _choice1
中停止message3
。 -
在 Variables 视图中,展开
Message
类别以公开MessageBody
变量。 右键点击
MessageBody
以打开其上下文菜单,然后选择 Change Value :将
数量
的值从 15 改为 10 (将其从无效顺序更改为有效顺序):这只更改内存值(它不会编辑
message3.xml
文件)。- 点击 确定。
切换到 Expressions 视图,然后选择
MessageBody
变量。变量列表下的窗格显示
message3
的整个正文,从而可以轻松地检查订购项目的当前值:点
进入下一个断点。
message3
现在遵循To_Fulfill 和 Route_
route2 的分支,而不是遵循发送到To_Fulfill
和Route_route2
的分支。
缩小 Camel debugger 的重点
您可以通过禁用和重新启用断点来临时缩小,然后重新扩展调试器的焦点:
-
Step
message4
through the routing context, check the Debug view, the Variables view, and the Console output in each step. -
在
_route1 [blueprint.xml] 中的 _choice1
中停止message4
。 切换到 Breakpoints 视图,然后清除
_choice1
下列出的断点旁边的每个复选框。清除断点的复选框会临时禁用它。点
进入下一个断点:
调试器跳过禁用的断点并跳转到
_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 章 通过路由追踪消息 教程中,您可以通过路由上下文跟踪信息,以确定您可以在什么位置优化并微调路由上下文的性能。