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();
}
}
}