搜索

第 7 章 调试路由上下文

download PDF

本教程介绍了如何使用 Camel 调试器查找本地运行路由上下文的逻辑错误。

目标

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

  • 在两个路由中感兴趣的节点上设置断点
  • 在 Debug 透视图中,逐步浏览路由并检查消息变量的值
  • 再次逐步浏览路由,更改消息变量的值并观察其效果

先决条件

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

设置断点

在 Debugger 中,您可以设置条件和无条件断点。在本教程中,您只设置无条件断点。要了解如何设置条件断点(在调试会话过程中满足特定条件时触发),请参阅 工具用户指南

设置无条件断点:

  1. 如有必要,在路由编辑器中打开 ZooOrderApp/src/main/resources/OSGI-INF/blueprint/blueprint.xml
  2. Project Explorer 中,展开 Camel Contexts src/main/resources/OSGI-INF/blueprint/blueprint.xml 以公开这两个路由条目。
  3. 双击 Route_route1 条目,在 Design 选项卡中将重点切换为 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
    • OT_US
    • SetHeader_setHead_ger
    • Log_ger
    • OT_GER

逐步浏览路由上下文

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

  • Step over ( Step Over icon )- 无论断点是什么,都恢复到路由上下文中的下一个执行节点。
  • resume ( Resume icon )- 跳到路由上下文中的下一个活跃断点。

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

      Camel debugger 会在它遇到的第一个断点挂起执行,并询问您是否要打开 Debug 视角:

      tutCnfrmPerspSwitch
    3. 单击 Yes

      注意

      如果您单击 No,则确认窗格会出现多次。在第三个 refusal 后,它会消失,Camel debugger 会恢复执行。要与调试器交互,您需要通过点 Window Open Perspective > Debug 来打开 Debug 视角。

      Debug perspective 将打开,其路由上下文在 _route1 [blueprint.xml] 中的 _choice1 中暂停,如 Debug 视图中所示:

      tutDebugPerspOpen1
      注意

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

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

      当您逐步执行路由上下文时,其值自上次断点以黄色突出显示时所更改的变量。您可能需要扩展每个断点的节点,以显示已更改的变量。

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

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

      检查自 Route1 [blueprint.xml] 中 _log2 的 断点以来更改的变量(高亮)。

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

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

      注意

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

      tutMsg3Choice1Stats

      计时指标以毫秒为单位。

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

      注意

      Debug 视图中的 Camel Context 节点下选择了线程或端点时,您必须点 Terminate icon 两次 - 来终止线程或端点,第二个用于终止 Camel 上下文,因此会话。

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

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

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

      注意

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

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

      tutDualCBRrteVerify

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

更改变量的值

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

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

    对于每个变量:

    1. Variables 视图中,扩展适当的类别来公开目标变量:
    2. 右键点击变量(本例中为 NodeId ),以打开上下文菜单并选择 Watch

      FTVarNodeIDWatch

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

      FTWatchM1NodeId
      注意

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

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

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

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

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

    tutChgVarsMsg2

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

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

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

    FTWatchM2R1toFfilVarChng
  13. Resume icon 进入下一个断点。

    message3 现在遵循 To_Fulfill 和 Route_ route2 的分支,而不是遵循发送到To_FulfillRoute_route2 的分支。

缩小 Camel debugger 的重点

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

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

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

    tutMsg3toFulfillRte1

    调试器跳过禁用的断点并跳转到 _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 章 通过路由追踪消息 教程中,您可以通过路由上下文跟踪信息,以确定您可以在什么位置优化并微调路由上下文的性能。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.