On 9/6/07, Ravi Narayana <[EMAIL PROTECTED]> wrote:
>
> I have a simple route with a producer in the middle which throws an exception
> (java.lang.IllegalArgumentException) as follows:
>
> from("direct:start").process(exceptionThrower).to("mock:result");
>
> As expected, the default error handler (Dead Letter Channel) is triggered
> which attempts to redeliver the message a few times. Since all the
> redelivery attempt fails, I do not expect the message to end up in my
> mock:result endpoint. But I see that the message is finally being delivered
> to the mock:result endpoint.
>
> If I add my own exception handler as follows:
>
> exception(IllegalArgumentException.class).to("mock:exception");
>
> then I see the message is delivered to both my mock:exception and mock:resut
> endpoints
>
> Am I missing something fundamental here?
>
> Here is the Test case:
> ================
>
> import junit.framework.TestCase;
>
> import org.apache.camel.CamelContext;
> import org.apache.camel.CamelTemplate;
> import org.apache.camel.Exchange;
> import org.apache.camel.Processor;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.component.mock.MockEndpoint;
> import org.apache.camel.impl.DefaultCamelContext;
> import org.apache.camel.util.jndi.JndiContext;
>
> public class ExceptionTest extends TestCase  {
>         private CamelContext camelContext;
>         private CamelTemplate<Exchange> template;
>
>         public ExceptionTest(String name) {
>                 super(name);
>         }
>
>         protected void setUp() throws Exception {
>                 super.setUp();
>                 JndiContext context = new JndiContext();
>                 camelContext = new DefaultCamelContext(context);
>                 template = new CamelTemplate<Exchange>(camelContext);
>                 camelContext.start();
>         }
>
>         public void testException() throws Exception {
>                 final Processor  exceptionThrower = new Processor() {
>                         public void process(Exchange exchange) throws 
> Exception  {
>                                 exchange.getIn().setBody("<exception/>");
>                                 throw new IllegalArgumentException("Exception 
> thrown intentionally.");
>                         }
>                 };
>                 RouteBuilder builder = new RouteBuilder() {
>                         public void configure() {
> //                              
> exception(IllegalArgumentException.class).to("mock:exception");
>                                 
> from("direct:start").process(exceptionThrower).to("mock:result");
>                         }
>                 };
>                 camelContext.addRoutes(builder);
>
>                 template.sendBody("direct:start", "<body/>");
>
>                 MockEndpoint resultEndpoint = 
> camelContext.getEndpoint("mock:result",
> MockEndpoint.class);
>                 MockEndpoint exceptionEndpoint =
> camelContext.getEndpoint("mock:exception", MockEndpoint.class);
>
>                 resultEndpoint.expectedMessageCount(0);
> //              exceptionEndpoint.expectedMessageCount(1);
>                 MockEndpoint.assertIsSatisfied(resultEndpoint, 
> exceptionEndpoint);
>         }
>
>         protected void tearDown() throws Exception {
>                 super.tearDown();
>                 camelContext.stop();
>         }
> }

Thanks for this great test case! I've added it to subversion...
http://svn.apache.org/repos/asf/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/issues/ExceptionTest.java

I made some minor refactorings to reuse ContextTestSupport to make the
test case a little simpler & easier to read.

However the test case works fine for me when using the exception
handler and when not.

i.e. the message never carries on to the final "mock:result" and the
exception handler makes it go to "mock:exception". When not using the
exception handler I see the dead letter queue deliver to the default
URI (namely to log an ERROR in log4j)

Am using trunk though - I wonder how to reproduce this issue? Were you
using 1.1.0?

-- 
James
-------
http://macstrac.blogspot.com/

Reply via email to