You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by dancerjohn <wi...@gmail.com> on 2013/03/14 12:54:55 UTC

Unexpected behavior of LoggingErrorHandler in Camel

So, I have a camel context that has a DeadLetterChannel with no redeliveries
at the context level. Within the context I have a route:

from("direct:input")
     .routeId("enrichHeader")
     .setHeader("myHeader").constant("someValue)
     .to("direct:output");

I have a unit test in which I interceptSendToEndpoint("direct:output") and
cause an exception to be thrown.

Then in the unit test I do producerTemplate.sendBody(theBody).

Now, as configured above on exception the message gets sent to the dead
letter channel. All's well. However, if I configure a loggingErrorHandler I
get odd behavior. So if I update the above route as follows:

from("direct:input")
     .routeId("enrichHeader")

     .errorHandler(
        loggingErrorHandler("com.myco.myproject")
             .level(LoggingLevel.WARN))

     .setHeader("myHeader").constant("someValue)
     .to("direct:output");

When I run the test now I get two unexpected behaviors. First, the exception
is still logged at level ERROR instead of the configured WARN. Second, the
exception is propagated back to the producerTemplate.sendBody(theBody)
invokation. 

On the one hand, the logging at ERROR is obviously odd. The other part that
seems odd is that the handler is propagating the exception. I would have
thought it would have marked it as handled and be done with it.

Is this expected behavior? Seems like documentation for the
LoggingErrorHandler is lacking.




--
View this message in context: http://camel.465427.n5.nabble.com/Unexpected-behavior-of-LoggingErrorHandler-in-Camel-tp5729173.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Unexpected behavior of LoggingErrorHandler in Camel

Posted by Christian Müller <ch...@gmail.com>.
Use the defaultErrorHandler if you want handle the exception (not
rethrowing the exception).

Using the following test, the exception is logged at level WARN (using
Camel 2.11-SNAPSHOT):

package org.apache.camel.builder;

import org.apache.camel.ContextTestSupport;
import org.apache.camel.LoggingLevel;

public class LoggingErrorHandlerTest extends ContextTestSupport {

    public void testLoggingErrorHandler() throws Exception {
        getMockEndpoint("mock:end").expectedMessageCount(1);

        template.sendBody("direct:start", "foo");

        assertMockEndpointsSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() {
                from("direct:start")

.errorHandler(loggingErrorHandler("com.mycompany.foo").level(LoggingLevel.WARN))
                    .to("mock:end")
                    .throwException(new Exception("forced exception for
test"));
            }
        };
    }
}

Log:
2013-03-20 23:48:21,404 [main           ] WARN
foo                            - Failed delivery for (MessageId:
ID-Christians-MacBook-Pro-local-53438-1363819701117-0-1 on ExchangeId:
ID-Christians-MacBook-Pro-local-53438-1363819701117-0-2). Exhausted after
delivery attempt: 1 caught: java.lang.Exception: forced exception for test
java.lang.Exception: forced exception for test
    at
org.apache.camel.builder.LoggingErrorHandlerTest$1.configure(LoggingErrorHandlerTest.java:39)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/test-classes/:]
    at
org.apache.camel.builder.RouteBuilder.checkInitialized(RouteBuilder.java:322)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/classes/:]
    at
org.apache.camel.builder.RouteBuilder.configureRoutes(RouteBuilder.java:276)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/classes/:]
    at
org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:262)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/classes/:]
    at
org.apache.camel.impl.DefaultCamelContext.addRoutes(DefaultCamelContext.java:648)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/classes/:]
    at
org.apache.camel.ContextTestSupport.setUp(ContextTestSupport.java:115)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/test-classes/:]
    at junit.framework.TestCase.runBare(TestCase.java:139)[junit-4.11.jar:]
    at
org.apache.camel.TestSupport.runBare(TestSupport.java:58)[file:/Users/cmueller/workspaceCamel/camel/camel-core/target/test-classes/:]
    at
junit.framework.TestResult$1.protect(TestResult.java:122)[junit-4.11.jar:]
    at
junit.framework.TestResult.runProtected(TestResult.java:142)[junit-4.11.jar:]
    at junit.framework.TestResult.run(TestResult.java:125)[junit-4.11.jar:]
    at junit.framework.TestCase.run(TestCase.java:129)[junit-4.11.jar:]
    at
junit.framework.TestSuite.runTest(TestSuite.java:255)[junit-4.11.jar:]
    at junit.framework.TestSuite.run(TestSuite.java:250)[junit-4.11.jar:]
    at
org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)[junit-4.11.jar:]
    at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)[file:/Applications/eclipse-4.2.2/configuration/org.eclipse.osgi/bundles/350/1/.cp/:]
    at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)[file:/Applications/eclipse-4.2.2/configuration/org.eclipse.osgi/bundles/349/1/.cp/:]
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)[file:/Applications/eclipse-4.2.2/configuration/org.eclipse.osgi/bundles/349/1/.cp/:]
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)[file:/Applications/eclipse-4.2.2/configuration/org.eclipse.osgi/bundles/349/1/.cp/:]
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)[file:/Applications/eclipse-4.2.2/configuration/org.eclipse.osgi/bundles/349/1/.cp/:]
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)[file:/Applications/eclipse-4.2.2/configuration/org.eclipse.osgi/bundles/349/1/.cp/:]

Best,
Christian

On Thu, Mar 14, 2013 at 12:54 PM, dancerjohn <wi...@gmail.com>wrote:

> So, I have a camel context that has a DeadLetterChannel with no
> redeliveries
> at the context level. Within the context I have a route:
>
> from("direct:input")
>      .routeId("enrichHeader")
>      .setHeader("myHeader").constant("someValue)
>      .to("direct:output");
>
> I have a unit test in which I interceptSendToEndpoint("direct:output") and
> cause an exception to be thrown.
>
> Then in the unit test I do producerTemplate.sendBody(theBody).
>
> Now, as configured above on exception the message gets sent to the dead
> letter channel. All's well. However, if I configure a loggingErrorHandler I
> get odd behavior. So if I update the above route as follows:
>
> from("direct:input")
>      .routeId("enrichHeader")
>
>      .errorHandler(
>         loggingErrorHandler("com.myco.myproject")
>              .level(LoggingLevel.WARN))
>
>      .setHeader("myHeader").constant("someValue)
>      .to("direct:output");
>
> When I run the test now I get two unexpected behaviors. First, the
> exception
> is still logged at level ERROR instead of the configured WARN. Second, the
> exception is propagated back to the producerTemplate.sendBody(theBody)
> invokation.
>
> On the one hand, the logging at ERROR is obviously odd. The other part that
> seems odd is that the handler is propagating the exception. I would have
> thought it would have marked it as handled and be done with it.
>
> Is this expected behavior? Seems like documentation for the
> LoggingErrorHandler is lacking.
>
>
>
>
> --
> View this message in context:
> http://camel.465427.n5.nabble.com/Unexpected-behavior-of-LoggingErrorHandler-in-Camel-tp5729173.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>



--