You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Camel 2.x - Debugger API

Available as of Camel 2.4

There is a new org.apache.camel.spi.Debugger API which allows 3rd party to attach a debugger tooling to debug Exchanges in Camel routes.
There is a default implementation in camel-core as the org.apache.camel.impl.DefaultDebugger.

Enabling

You can enable the debugger from the CamelContext using the setDebugger. We may add a nicer API for this in the future.

Breakpoint

There is a org.apache.camel.spi.Breakpoint API in which the 3rd party tooling implement logic what should happen when the breakpoint is hit.

The breakpoint can be invoked in 2 kind of styles in Camel:

  • processing based
  • event based

The processing is based on a before and after callback when the Exchange is being routed and thus a Processor is invoked.

The event is based on the EventNotifer emitting events such as ExchangeCreatedEvent, ExchangeFailureEvent etc. This allows you to have breakpoints when a given Exchange has failed. Or when they are done, so you can inspect the result etc.

There is a org.apache.camel.impl.BreakpointSupport class which can be used to extend, to avoid implementing all the methods from the interface.

Condition

There is a org.apache.camel.spi.Condition API in which the 3rd party tooling can provide conditions when the breakpoints should apply. For example a conditional breakpoint which only triggers if the message body is a certain message / type etc.

The condition can be invoked in 2 kind of styles in Camel:

  • processing based
  • event based

Where there is a match method for each style.

There is a org.apache.camel.impl.ConditionSupport class which can be used to extend, to avoid implementing all the methods from the interface.

Example

For example we can have this breakpoint


        breakpoint = new BreakpointSupport() {
            public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition definition) {
                String body = exchange.getIn().getBody(String.class);
                logs.add("Breakpoint at " + definition + " with body: " + body);
            }
        }

In which we want to trigger when the message contains Camel. So we can create this Condition:

        camelCondition = new ConditionSupport() {
            public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition definition) {
                return body().contains("Camel").matches(exchange);
            }
        };

And to use this we just tell the Debugger as follows:

    public void testDebug() throws Exception {
        context.getDebugger().addBreakpoint(breakpoint, camelCondition);

        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World", "Hello Camel");

        template.sendBody("direct:start", "Hello World");
        template.sendBody("direct:start", "Hello Camel");

        assertMockEndpointsSatisfied();

        assertEquals(2, logs.size());
        assertEquals("Breakpoint at To[log:foo] with body: Hello Camel", logs.get(0));
        assertEquals("Breakpoint at To[mock:result] with body: Hello Camel", logs.get(1));
    }

Which then will only invoke the breakpoint callback for the "Hello Camel" message.

Single step

TODO: bla bla

  • No labels