第 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 Contextssrc/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(在Exchangecategory 中)和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
message4through 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 章 通过路由追踪消息 教程中,您可以通过路由上下文跟踪信息,以确定您可以在什么位置优化并微调路由上下文的性能。