架构

调试器

师成师成· 更新于 2026-09-28· 阅读 9 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

调试器

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 端点。

image

使用 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 会再次挂起消息处理。

如果环境变量和系统属性同时设置,则使用环境变量的值。

有多个第三方工具在使用它:

要启用 JMX,Camel 要求 classpath 中包含 camel-management JAR。

评论

登录后参与评论

正在加载评论…