I'm building my route like this:

   //context.setTracing(true);
   errorHandler(loggingErrorHandler("whatever").level(LoggingLevel.ERROR));
   from("direct:start").log("start:
   ${body}").to("seda:seda1?size=2&blockWhenFull=false").log("after:
   ${body}");

When I run it and send it 3 messages the first 2 log ok (both "start" and "after"), but the 3rd message (which fills the seda queue and throws a "Queue full" exception) only shows up in a "start" log message, no exception is shown or delivered to my test code, and the route just shuts down with no ERROR log.

However if I uncomment "context.setTracing(true)", then the 3rd message triggers my error handler and its "whatever" log message, along with a stack trace, etc.

My understanding is that the "errorHandler(...)" call sets the error handler for the entire context. So why doesn't it get triggered unless I turn on tracing?

I've attached the entire junit-4 test.

package xp;

import static org.junit.Assert.*;

import org.apache.camel.CamelContext;
import org.apache.camel.LoggingLevel;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.ExchangeBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class ErrHandlingCamel
{
    private CamelContext context;
    private ProducerTemplate template;

    @Before
    public void setUp() throws Exception
    {
        context = new DefaultCamelContext();
        template = context.createProducerTemplate();

        context.addRoutes(new RouteBuilder()
        {
            public void configure() throws Exception
            {
                // seda test, queue is full after 2 messages,
                {
                    //context.setTracing(true);
                    errorHandler(loggingErrorHandler("whatever").level(LoggingLevel.ERROR));

                    from("direct:start").log("start: ${body}").to("seda:seda1?size=2&blockWhenFull=false").log("after: ${body}");
                }

            }
        });
        context.start();
    }

    @After
    public void tearDown() throws Exception
    {
        template.stop();
        context.stop();
    }

    @Test
    public void testErrHandling() throws Exception
    {
        try
        {
            for (int i = 0; i < 3; i++)
                template.send("direct:start", ExchangeBuilder.anExchange(context).withBody("msg" + i).build());
        }
        catch (Exception ex)
        {
            System.err.println("test failed! caught exception:" + ex);
            ex.printStackTrace(System.err);
            fail();
        }
    }
}

Reply via email to