调试器
调试器
Camel 调试器(Debugger)面向第三方工具而设计,用于调试路由、跟踪消息,以及在 Camel 路由中的 EIP(企业集成模式)上使用断点。
调试器允许工具等在Exchange 路由时挂载断点,并在断点被触发时调用相应处理。
Java 在单元测试中调试 Camel 路由
如果你正在使用 camel-test-junit5 组件开发单元测试,那么只需重写 isUseDebugger() 方法并返回 true 来启用调试器,即可使用该调试器。
在这个单元测试中
仅限 Java:继承 CamelTestSupport 以进行调试
public class DebugTest extends CamelTestSupport我们想要调试以下路由
仅限 Java:在单元测试中创建要调试的路由
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// this is the route we want to debug
from("direct:start")
.to("mock:a")
.transform(body().prepend("Hello "))
.to("mock:b");
}
};
}只需重写 debugBefore 方法即可轻松实现,如下所示
仅限 Java:启用调试器并在 debugBefore 中设置断点
@Override
public boolean isUseDebugger() {
// must enable debugger
return true;
}
@Override
protected void debugBefore(Exchange exchange, Processor processor,
ProcessorDefinition<?> definition, String id, String shortName) {
// this method is invoked before we are about to enter the given processor
// from your Java editor you can just add a breakpoint in the code line below
log.info("Before " + definition + " with body " + exchange.getIn().getBody());
}然后,在 Java 编辑器中,只需在 debugBefore 方法内部添加一个断点。接着运行单元测试,等待 Java 编辑器命中该断点。随后你便可以在调试过程中检查 Exchange,观察它在路由中的推进过程。ProcessorDefinition 以及 id 和 shortName 参数所提供的信息,可以告诉你断点是在路由的哪个位置被命中的。
还有一个 debugAfter 方法,它会在处理器被调用之后执行。这使你能够查看在路由中的某个处理器被调用之后,Exchange 发生了什么变化。 |
|---|
下图展示了调试器的实际运行情况。IDE(IDEA)已经命中了断点,我们可以检查这些参数。注意,我们可以看到该消息将被发送到 mock:a 端点。

使用 Java DSL 编写的 Camel 路由的 Java 调试
调试使用 Java DSL 编写的 Camel 路由有一个技巧,就是修改路由,插入一个 processor,然后在其中设置断点。
例如:
仅使用 Java:在路由中插入一个用于调试的 processor 断点
public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:demo").routeId("foo")
.bean("myBean", "hello")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("put a breakpoint here");
}
})
.log("${body}")
.bean("myBean", "bye")
.log("${body}");
}
}实现自定义调试器
调试器 API 定义在 org.apache.camel.spi.Debugger 中。该 API 提供了附加和移除断点的方法。
还提供了挂起/恢复所有断点等功能。你也可以为断点附加一个条件,只有在条件匹配时断点才会触发。
Camel 提供了一个基础实现 org.apache.camel.impl.DefaultDebugger,可以基于它进行扩展以实现自定义的调试器。
通过 JMX 进行 Camel 路由调试
还有一个 Backlog Debugger,允许通过 JMX 进行调试。当 classpath 中包含 camel-debug 时(自 3.16 起),或使用 camel:debug Maven 目标时(自 3.18 起),它会自动提供。
为了有足够的时间添加断点,自 3.18 起,你可能需要暂停 Camel 的消息处理,以确保不会漏掉任何消息。为此,你需要在应用上下文中将环境变量 CAMEL_DEBUGGER_SUSPEND 或系统属性 org.apache.camel.debugger.suspend 设置为 true,这样 Backlog Debugger 就会挂起消息处理,直到调用 JMX 操作 attach 为止。调用 JMX 操作 detach 会再次挂起消息处理。
如果环境变量和系统属性同时设置,则使用环境变量的值。
有多个第三方工具在使用它:
- hawtio 将其用于基于 Web 的调试功能
- VS Code Debug Adapter for Camel
- Eclipse Desktop Debug Adapter for Camel
- IntelliJ Camel plugin
- Debug Adapter Server for Camel
要启用 JMX,Camel 要求 classpath 中包含 camel-management JAR。
评论
登录后参与评论
KnowForge