第 7 章 调试路由上下文

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

目标

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

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

先决条件

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

设置断点

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

设置无条件断点:

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

逐步浏览路由上下文

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

  • Step over ( Step Over icon )- 转至路由上下文中的下一个执行节点,而不考虑断点。
  • 恢复( Resume icon )- 在路由上下文中转至下一个活跃断点。

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

      Camel 调试器会在遇到的第一个断点挂起执行,并询问您现在是否要打开 Debug 透视图:

      tutCnfrmPerspSwitch
    3. 单击 Yes

      注意

      如果您单击 No,则确认窗格会出现多次。第三个引用后,它会消失,Camel 调试器恢复执行。此时要与调试器交互,您需要通过点击 WindowOpen Perspective → > Debug 来打开 Debug 透视图。

      Debug 视角会打开,并显示在 _route1 [blueprint.xml] 中的 _choice1 暂停的路由上下文,如 Debug 视图所示:

      tutDebugPerspOpen1
      注意

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

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

      当您完成路由上下文时,自上色中突出显示了最后一个断点后,其值已更改的变量。您可能需要在每个断点扩展节点,以显示已更改的变量。

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

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

      检查更改的变量(高亮),因为 Route1 [blueprint.xml] 中的断点是 _log2

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

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

      注意

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

      tutMsg3Choice1Stats

      时间指标以毫秒为单位。

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

      注意

      Debug 视图中的 Camel Context node 下选择线程或端点时,您必须点击 Terminate icon 两次 - 首先终止线程或端点,第二次终止 Camel 上下文,因此会话。

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

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

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

      注意

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

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

      tutDualCBRrteVerify

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

更改变量的值

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

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

    对于每个四个变量:

    1. Variables 视图中,展开适当的类别以公开 target 变量:
    2. 在变量(本例中为 NodeId )打开上下文菜单并选择 Watch:

      FTVarNodeIDWatch

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

      FTWatchM1NodeId
      注意

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

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

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

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

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

    tutChgVarsMsg2

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

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

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

    FTWatchM2R1toFfilVarChng
  13. Resume icon 进入下一步。

    message3 现在遵循导致To_FulfillRoute_route2 的分支,而不是跟随 To_Invalid 的分支。

缩小 Camel 调试器的重点范围

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

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

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

    tutMsg3toFulfillRte1

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