You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Charles Moulliard <cm...@gmail.com> on 2009/08/12 14:53:58 UTC

Try/catch with split

Hi,

I'm back again with try/catch and split. I have created the following unit
test who seems to work but I don't understand why the try/catch block of the
test does not receive the error ?

Code

package org.apache.camel.processor;

import org.apache.camel.ContextTestSupport;
// import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.JndiRegistry;

public class SplitterTryCatchErrorTest extends ContextTestSupport {

   public void testSplitWithError() throws Exception {
        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
        resultEndpoint.expectedBodiesReceived("James");

        try {
            template.sendBody("direct:startWithError", "Claus@James
@Willem");
            //fail("Should have thrown an exception");
        } catch (Exception e) {
            assertTrue(e.getCause().getMessage().startsWith("This is a dummy
error James!"));
        }

        assertMockEndpointsSatisfied();
    }


    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry jndi = super.createRegistry();
        jndi.bind("error", new GenerateError());
        return jndi;
    }

    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("direct:startWithError")
                    .split(body().tokenize("@"))
                    .doTry()
                        // GENERATE A DUMMY ERROR
                        .to("bean:error")
                        .to("mock:result")
                       .doCatch(java.lang.Exception.class)
                           .to("mock:error")
                    .end();

    }

    public static final class GenerateError {
        public GenerateError() {
            // Helper Class
        }

        public String dummyException(String payload) throws Exception {
            if (payload.equals("James")) {
                throw new Exception("This is a dummy error James!");
            }
            return "Hello " + payload;
        }

    }


}

What I observe in the log is that the split of the body is done and each
message is processed individually : one for Claus, one for Willem. For
James, a dummy exception is throwed.

2009-08-12 14:41:06,701 [main           ] DEBUG
ProducerCache                  - >>>> Endpoint[direct://startWithError]
Exchange[Message: Claus@James@Willem]
2009-08-12 14:41:06,811 [main           ] DEBUG
ProcessorEndpoint$1            - Starting producer: Producer[bean://error]
2009-08-12 14:41:06,811 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[bean://error] for producer: Producer[bean://error]
2009-08-12 14:41:09,233 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Claus
2009-08-12 14:41:09,233 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Claus
2009-08-12 14:41:09,248 [main           ] DEBUG
MockEndpoint$1                 - Starting producer: Producer[mock://result]
2009-08-12 14:41:09,248 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[mock://result] for producer: Producer[mock://result]
2009-08-12 14:41:09,248 [main           ] DEBUG
MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
Hello Claus] with body: Hello Claus
2009-08-12 14:41:09,248 [main           ] DEBUG
Pipeline                       - Message exchange has failed so breaking out
of pipeline: Exchange[Message: James] Exception: java.lang.Exception: This
is a dummy error James!
2009-08-12 14:41:09,264 [main           ] DEBUG
MockEndpoint$1                 - Starting producer: Producer[mock://error]
2009-08-12 14:41:09,264 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[mock://error] for producer: Producer[mock://error]
2009-08-12 14:41:09,264 [main           ] DEBUG
MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
James] with body: James
2009-08-12 14:41:09,264 [main           ] DEBUG
TryProcessor                   - The exception is handled: true for the
exception: java.lang.Exception caused by: This is a dummy error James!
2009-08-12 14:41:09,264 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Willem
2009-08-12 14:41:09,264 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Willem
2009-08-12 14:41:09,264 [main           ] DEBUG
MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
Hello Willem] with body: Hello Willem
2009-08-12 14:41:09,264 [main           ] DEBUG
MulticastProcessor             - Done sequientel processing 3 exchanges
2009-08-12 14:41:09,264 [main           ] INFO
MockEndpoint                   - Asserting: Endpoint[mock://result] is
satisfied
2009-08-12 14:41:09,264 [main           ] INFO
MockEndpoint                   - Asserting: Endpoint[mock://error] is
satisfied
2009-08-12 14:41:09,264 [main           ] DEBUG
SplitterTryCatchErrorTest      - tearDown test: testSplitWithError

The test succeeds but the exception is not catched in the try/catch block of
testSplitWithError. What is wrong ?

Regards,

Charles

Re: Try/catch with split

Posted by Charles Moulliard <cm...@gmail.com>.
Many thanks.

On Sat, Aug 15, 2009 at 5:34 PM, Claus Ibsen <cl...@gmail.com> wrote:

> Hi
>
> You need the <split> to span the entire route such as
>
>    <bean id="error"
>
> class="org.apache.camel.issues.TryCatchWithSplitNotHandledIssueTest$GenerateError"/>
>
>    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
>        <route>
>             <from uri="direct:start"/>
>            <split><tokenize token="@"/>
>                <doTry>
>                    <to uri="bean:error"/>
>                    <to uri="mock:result"/>
>                     <doCatch>
>                        <exception>java.lang.Exception</exception>
>                        <handled><constant>false</constant></handled>
>                         <to uri="mock:error"/>
>                    </doCatch>
>                </doTry>
>            </split>
>        </route>
>    </camelContext>
>
>
> On Fri, Aug 14, 2009 at 3:39 PM, Charles Moulliard<cm...@gmail.com>
> wrote:
> > I try to translate the syntax of Java DSL into Spring DSL.
> >
> >        <route>
> >              <from uri="direct:startWithError"/>
> >                   <doTry>
> >                   <split>
> >                          <tokenize token="@"/>
> >                         <bean ref="error"/>
> >                         <to uri="mock:result"/>
> >                    </split>
> >                     <doCatch>
> >                        <exception>java.lang.Exception</exception>
> >                        <handled>
> >                            <constant>false</constant>
> >                        </handled>
> >                        <to
> >
> uri="log:org.apache.camel.processor?level=INFO&amp;multiline=true&amp;showException=true&amp;showCaughtException=true&amp;showStackTrace=false"/>
> >                        <to uri="mock:error"/>
> >                      </doCatch>
> >                  </doTry>
> >        </route>
> >
> > The following syntax which is accepted is not the correct one because the
> > mock:error endpoint does not receive anything when excecuting the test
> case
> > !!
> >
> > Regards,
> >
> > Charles Moulliard
> > Senior Enterprise Architect
> > Apache Camel Committer
> >
> > *****************************
> > blog : http://cmoulliard.blogspot.com
> >
> >
> > On Fri, Aug 14, 2009 at 3:12 PM, Charles Moulliard <cmoulliard@gmail.com
> >wrote:
> >
> >> Thx.
> >>
> >> With the following syntax, it works :
> >>
> >>    public void testSplitWithError() throws Exception {
> >>         MockEndpoint error = getMockEndpoint("mock:error");
> >>         error.expectedBodiesReceived("James");
> >>
> error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
> >>
> >>         MockEndpoint result = getMockEndpoint("mock:result");
> >>         result.expectedBodiesReceived("Hello Claus", "Hello Willem");
> >>
> >>         try {
> >>             template.sendBody("direct:startWithError", "Claus@James
> >> @Willem");
> >>             fail("Exception has been throwed");
> >>         } catch (CamelExecutionException ex) {
> >>             // Nothing to do
> >>         }
> >>
> >>         assertMockEndpointsSatisfied();
> >>     }
> >>
> >> Regards,
> >>
> >> Charles Moulliard
> >> Senior Enterprise Architect
> >> Apache Camel Committer
> >>
> >> *****************************
> >> blog : http://cmoulliard.blogspot.com
> >>
> >>
> >> On Fri, Aug 14, 2009 at 2:52 PM, Claus Ibsen <claus.ibsen@gmail.com
> >wrote:
> >>
> >>> You need try .. catch around the template when you send a message as
> >>> you do NOT handle the exception and thus the client get this exception
> >>> back.
> >>>
> >>>
> >>> On Fri, Aug 14, 2009 at 2:43 PM, Charles Moulliard<
> cmoulliard@gmail.com>
> >>> wrote:
> >>> > I have adapted the test case as you propose but it fails.
> >>> >
> >>> > org.apache.camel.CamelExecutionException: Exception occured during
> >>> execution
> >>> > on the exchange: Exchange[Message: Hello Willem]
> >>> >    at
> >>> >
> >>>
> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
> >>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>> >    at
> >>> >
> >>>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >>> >    at
> >>> >
> >>>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >>> >    at java.lang.reflect.Method.invoke(Method.java:597)
> >>> >    at junit.framework.TestCase.runTest(TestCase.java:164)
> >>> >    at junit.framework.TestCase.runBare(TestCase.java:130)
> >>> >    at junit.framework.TestResult$1.protect(TestResult.java:106)
> >>> >    at junit.framework.TestResult.runProtected(TestResult.java:124)
> >>> >    at junit.framework.TestResult.run(TestResult.java:109)
> >>> >    at junit.framework.TestCase.run(TestCase.java:120)
> >>> >    at junit.framework.TestSuite.runTest(TestSuite.java:230)
> >>> >    at junit.framework.TestSuite.run(TestSuite.java:225)
> >>> >    at
> >>> >
> >>>
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
> >>> >    at
> >>> >
> >>>
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> >>> >    at
> >>> >
> >>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
> >>> >    at
> >>> >
> >>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
> >>> >    at
> >>> >
> >>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
> >>> >    at
> >>> >
> >>>
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> >>> > Caused by: java.lang.Exception: This is a dummy error James!
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
> >>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>> >    at
> >>> >
> >>>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >>> >    at
> >>> >
> >>>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >>> >    at java.lang.reflect.Method.invoke(Method.java:597)
> >>> >    at
> >>> >
> org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
> >>> >    at
> >>> >
> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
> >>> >    at
> >>> >
> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
> >>> >    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
> >>> >    at
> >>> org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
> >>> >    at
> >>> >
> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
> >>> >    at
> >>> >
> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
> >>> >    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
> >>> >    at
> >>> >
> >>>
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
> >>> >    ... 20 more
> >>> >
> >>> >
> >>> >
> >>> > CODE ********************************************************
> >>> >
> >>> > import org.apache.camel.ContextTestSupport;
> >>> > import org.apache.camel.Exchange;
> >>> > import org.apache.camel.builder.RouteBuilder;
> >>> > import org.apache.camel.component.mock.MockEndpoint;
> >>> > import org.apache.camel.impl.JndiRegistry;
> >>> >
> >>> > /**
> >>> >  * @version $Revision: 736555 $
> >>> >  */
> >>> > public class SplitterTryCatchErrorTest extends ContextTestSupport {
> >>> >
> >>> >   public void testSplitWithError() throws Exception {
> >>> >        MockEndpoint error = getMockEndpoint("mock:error");
> >>> >        error.expectedBodiesReceived("James");
> >>> >
> >>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
> >>> > is a dummy error James!");
> >>> >
> >>> >        MockEndpoint result = getMockEndpoint("mock:result");
> >>> >        result.expectedBodiesReceived("Hello Claus", "Hello Willem");
> >>> >
> >>> >        template.sendBody("direct:startWithError", "Claus@James
> >>> @Willem");
> >>> >
> >>> >        assertMockEndpointsSatisfied();
> >>> >    }
> >>> >
> >>> >    protected JndiRegistry createRegistry() throws Exception {
> >>> >        JndiRegistry jndi = super.createRegistry();
> >>> >        jndi.bind("error", new GenerateError());
> >>> >        return jndi;
> >>> >    }
> >>> >
> >>> >    protected RouteBuilder createRouteBuilder() {
> >>> >        return new RouteBuilder() {
> >>> >            public void configure() {
> >>> >                from("direct:startWithError")
> >>> >                    .split(body().tokenize("@"))
> >>> >                    .doTry()
> >>> >                        // GENERATE A DUMMY ERROR
> >>> >                        .to("bean:error")
> >>> >                        .to("mock:result")
> >>> >
> .doCatch(java.lang.Exception.class).handled(false)
> >>> >
> >>> >
> >>>
> .to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
> >>> >                           .to("mock:error")
> >>> >                    .end();
> >>> >            }
> >>> >        };
> >>> >    }
> >>> >
> >>> >    public static final class GenerateError {
> >>> >        public GenerateError() {
> >>> >            // Helper Class
> >>> >        }
> >>> >
> >>> >        public String dummyException(String payload) throws Exception
> {
> >>> >            if (payload.equals("James")) {
> >>> >                throw new Exception("This is a dummy error James!");
> >>> >            }
> >>> >            return "Hello " + payload;
> >>> >        }
> >>> >
> >>> >    }
> >>> >
> >>> >
> >>> > }
> >>> >
> >>> > ********************************************
> >>> >
> >>> > Here is the trace of the log
> >>> >
> >>> > 2009-08-14 14:34:57,726 [main           ] INFO
> >>> > DefaultCamelContext            - JMX enabled. Using
> >>> > InstrumentationLifecycleStrategy.
> >>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
> >>> > SplitterTryCatchErrorTest      - Using created route builder: Routes:
> []
> >>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
> >>> > DefaultCamelContext            - Adding routes from builder: Routes:
> []
> >>> > 2009-08-14 14:34:58,132 [main           ] INFO
> >>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> is
> >>> > starting
> >>> > 2009-08-14 14:34:58,132 [main           ] DEBUG
> >>> > DefaultProducerServicePool     - Starting service pool:
> >>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
> >>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
> >>> > DefaultComponentResolver       - Found component: direct via type:
> >>> > org.apache.camel.component.direct.DirectComponent via:
> >>> > META-INF/services/org/apache/camel/component/direct
> >>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
> >>> > DefaultComponent               - Creating endpoint
> >>> > uri=[direct://startWithError], path=[startWithError], parameters=[{}]
> >>> > 2009-08-14 14:34:58,616 [main           ] DEBUG
> >>> > DefaultCamelContext            - direct://startWithError converted to
> >>> > endpoint: Endpoint[direct://startWithError] by component:
> >>> > org.apache.camel.component.direct.DirectComponent@1e0f2f6
> >>> > 2009-08-14 14:34:58,695 [main           ] DEBUG
> >>> > DefaultComponentResolver       - Found component: bean via type:
> >>> > org.apache.camel.component.bean.BeanComponent via:
> >>> > META-INF/services/org/apache/camel/component/bean
> >>> > 2009-08-14 14:34:58,710 [main           ] DEBUG
> >>> > DefaultComponent               - Creating endpoint
> uri=[bean://error],
> >>> > path=[error], parameters=[{}]
> >>> > 2009-08-14 14:34:58,726 [main           ] DEBUG
> >>> > DefaultCamelContext            - bean://error converted to endpoint:
> >>> > Endpoint[bean://error] by component:
> >>> > org.apache.camel.component.bean.BeanComponent@1c0f2e5
> >>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
> >>> > DefaultComponentResolver       - Found component: mock via type:
> >>> > org.apache.camel.component.mock.MockComponent via:
> >>> > META-INF/services/org/apache/camel/component/mock
> >>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
> >>> > DefaultComponent               - Creating endpoint
> uri=[mock://result],
> >>> > path=[result], parameters=[{}]
> >>> > 2009-08-14 14:34:58,788 [main           ] DEBUG
> >>> > DefaultCamelContext            - mock://result converted to endpoint:
> >>> > Endpoint[mock://result] by component:
> >>> > org.apache.camel.component.mock.MockComponent@1977b9b
> >>> > 2009-08-14 14:34:58,835 [main           ] DEBUG
> >>> > DefaultComponentResolver       - Found component: log via type:
> >>> > org.apache.camel.component.log.LogComponent via:
> >>> > META-INF/services/org/apache/camel/component/log
> >>> > 2009-08-14 14:34:58,851 [main           ] DEBUG
> >>> > DefaultComponent               - Creating endpoint
> >>> >
> >>>
> uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
> >>> > path=[org.apache.camel.processor], parameters=[{level=INFO,
> >>> multiline=true,
> >>> > showCaughtException=true, showException=true, showStackTrace=false}]
> >>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
> >>> > DefaultCamelContext            -
> >>> >
> >>>
> log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
> >>> > converted to endpoint:
> >>> >
> >>>
> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> >>> > by component: org.apache.camel.component.log.LogComponent@1a7ddcf
> >>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
> >>> > DefaultComponent               - Creating endpoint
> uri=[mock://error],
> >>> > path=[error], parameters=[{}]
> >>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
> >>> > DefaultCamelContext            - mock://error converted to endpoint:
> >>> > Endpoint[mock://error] by component:
> >>> > org.apache.camel.component.mock.MockComponent@1977b9b
> >>> > 2009-08-14 14:34:58,976 [main           ] DEBUG
> >>> > DefaultCamelContext            - Starting routes
> >>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
> >>> > DirectConsumer                 - Starting consumer:
> >>> > Consumer[direct://startWithError]
> >>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
> >>> > DefaultCamelContext            - Route 0:
> >>> > EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
> >>> > UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
> >>> > {Pipeline[Channel[sendTo(Endpoint[bean://error])],
> >>> > Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
> >>> > java.lang.Exception] ->
> >>> >
> >>>
> Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
> >>> > Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
> >>> > useLatestAggregationStrategy]])]
> >>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
> >>> > DefaultCamelContext            - Started routes
> >>> > 2009-08-14 14:34:59,116 [main           ] INFO
> >>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> >>> > started
> >>> > 2009-08-14 14:34:59,163 [main           ] DEBUG
> >>> > DirectProducer                 - Starting producer:
> >>> > Producer[direct://startWithError]
> >>> > 2009-08-14 14:34:59,179 [main           ] DEBUG
> >>> > ProducerCache                  - Adding to producer cache with key:
> >>> > Endpoint[direct://startWithError] for producer:
> >>> > Producer[direct://startWithError]
> >>> > 2009-08-14 14:34:59,304 [main           ] DEBUG
> >>> > ProducerCache                  - >>>>
> Endpoint[direct://startWithError]
> >>> > Exchange[Message: Claus@James@Willem]
> >>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
> >>> > ProcessorEndpoint$1            - Starting producer:
> >>> Producer[bean://error]
> >>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
> >>> > ProducerCache                  - Adding to producer cache with key:
> >>> > Endpoint[bean://error] for producer: Producer[bean://error]
> >>> > 2009-08-14 14:35:00,726 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.component.file.GenericFileConverter
> >>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
> >>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.StaticMethodWithExchangeTestConverter
> >>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.CamelConverter
> >>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.CollectionConverter
> >>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.IOConverter
> >>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.jaxp.DomConverter
> >>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.jaxp.StaxConverter
> >>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.jaxp.StreamSourceConverter
> >>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.jaxp.XmlConverter
> >>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.NIOConverter
> >>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.ObjectConverter
> >>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> >>> > AnnotationTypeConverterLoader  - Loading converter class:
> >>> > org.apache.camel.converter.stream.StreamCacheConverter
> >>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> >>> > BeanProcessor                  - Setting bean invocation result on
> the
> >>> IN
> >>> > message: Hello Claus
> >>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> >>> > BeanProcessor                  - Setting bean invocation result on
> the
> >>> IN
> >>> > message: Hello Claus
> >>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> >>> > MockEndpoint$1                 - Starting producer:
> >>> Producer[mock://result]
> >>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> >>> > ProducerCache                  - Adding to producer cache with key:
> >>> > Endpoint[mock://result] for producer: Producer[mock://result]
> >>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> >>> > MockEndpoint                   - mock://result >>>> 1 :
> >>> Exchange[Message:
> >>> > Hello Claus] with body: Hello Claus
> >>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> >>> > Pipeline                       - Message exchange has failed so
> breaking
> >>> out
> >>> > of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
> >>> This
> >>> > is a dummy error James!
> >>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> >>> > ProcessorEndpoint$1            - Starting producer:
> >>> >
> >>>
> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> >>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> >>> > ProducerCache                  - Adding to producer cache with key:
> >>> >
> >>>
> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> >>> > for producer:
> >>> >
> >>>
> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> >>> > 2009-08-14 14:35:00,835 [main           ] INFO
> >>> > processor                      - Exchange[
> >>> > , BodyType:String
> >>> > , Body:James
> >>> > , CaughtExceptionType:java.lang.Exception,
> CaughtExceptionMessage:This
> >>> is a
> >>> > dummy error James!]
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > MockEndpoint$1                 - Starting producer:
> >>> Producer[mock://error]
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > ProducerCache                  - Adding to producer cache with key:
> >>> > Endpoint[mock://error] for producer: Producer[mock://error]
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > MockEndpoint                   - mock://error >>>> 1 :
> Exchange[Message:
> >>> > James] with body: James
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > TryProcessor                   - The exception is handled: false for
> the
> >>> > exception: java.lang.Exception caused by: This is a dummy error
> James!
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > DefaultErrorHandler            - Failed delivery for exchangeId:
> >>> > ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0
> caught:
> >>> > java.lang.Exception: This is a dummy error James!
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > DefaultErrorHandler            - This exchange is not handled so its
> >>> marked
> >>> > as failed: Exchange[Message: James]
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > BeanProcessor                  - Setting bean invocation result on
> the
> >>> IN
> >>> > message: Hello Willem
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > BeanProcessor                  - Setting bean invocation result on
> the
> >>> IN
> >>> > message: Hello Willem
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > MockEndpoint                   - mock://result >>>> 2 :
> >>> Exchange[Message:
> >>> > Hello Willem] with body: Hello Willem
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > MulticastProcessor             - Done sequientel processing 3
> exchanges
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > DefaultErrorHandler            - Failed delivery for exchangeId:
> >>> > ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0
> caught:
> >>> > java.lang.Exception: This is a dummy error James!
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > DefaultErrorHandler            - This exchange is not handled so its
> >>> marked
> >>> > as failed: Exchange[Message: Hello Willem]
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
> >>> > 2009-08-14 14:35:00,835 [main           ] INFO
> >>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> is
> >>> > stopping
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > DirectConsumer                 - Stopping consumer:
> >>> > Consumer[direct://startWithError]
> >>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> >>> > DefaultProducerServicePool     - Stopping service pool:
> >>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
> >>> > 2009-08-14 14:35:00,835 [main           ] INFO
> >>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> >>> > stopped
> >>> >
> >>> > Regards,
> >>> >
> >>> > Charles Moulliard
> >>> > Senior Enterprise Architect
> >>> > Apache Camel Committer
> >>> >
> >>> > *****************************
> >>> > blog : http://cmoulliard.blogspot.com
> >>> >
> >>> >
> >>> > On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <claus.ibsen@gmail.com
> >
> >>> wrote:
> >>> >
> >>> >> Hi
> >>> >>
> >>> >> But Camel is smart and flexible so it allows you to lower the
> handled
> >>> >> flag on doCatch (noticed handled(false)) so you can do like this, in
> >>> >> which the client will get the exception back in his face. And the
> >>> >> mock:error can see the caused exception from a property on the
> >>> >> exchange
> >>> >>
> >>> >>        MockEndpoint error = getMockEndpoint("mock:error");
> >>> >>        error.expectedBodiesReceived("James");
> >>> >>
> >>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
> >>> >>
> >>> >>
> >>> >>                from("direct:start")
> >>> >>                    .split(body().tokenize("@"))
> >>> >>                    .doTry()
> >>> >>                         .to("bean:error")
> >>> >>                        .to("mock:result")
> >>> >>                     .doCatch(Exception.class).handled(false)
> >>> >>                        .to("mock:error")
> >>> >>                    .end();
> >>> >>
> >>> >>
> >>> >> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<claus.ibsen@gmail.com
> >
> >>> >> wrote:
> >>> >> > Hi
> >>> >> >
> >>> >> > Works fine I will commit an unit test later when Hadrian is done
> with
> >>> >> > the build of Camel 2.0 release.
> >>> >> >
> >>> >> > 2 messages goes to mock:result
> >>> >> > 1 message go to mock:error
> >>> >> >
> >>> >> > All as expected.
> >>> >> >
> >>> >> > Since you use doTry .. doCatch the client will not receive any
> >>> >> > exception as he will not do that either when you do
> >>> >> >
> >>> >> > try {
> >>> >> >
> >>> >> > } catch (Exception e) {
> >>> >> >  .. do something
> >>> >> > }
> >>> >> >
> >>> >> > Since you do NOT rethrow the exception in the catch block.
> Catching
> >>> an
> >>> >> > exception is like handling it = NO MORE AN EXCEPTION
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<
> >>> cmoulliard@gmail.com>
> >>> >> wrote:
> >>> >> >> Hi,
> >>> >> >>
> >>> >> >> I'm back again with try/catch and split. I have created the
> >>> following
> >>> >> unit
> >>> >> >> test who seems to work but I don't understand why the try/catch
> >>> block of
> >>> >> the
> >>> >> >> test does not receive the error ?
> >>> >> >>
> >>> >> >> Code
> >>> >> >>
> >>> >> >> package org.apache.camel.processor;
> >>> >> >>
> >>> >> >> import org.apache.camel.ContextTestSupport;
> >>> >> >> // import org.apache.camel.RuntimeCamelException;
> >>> >> >> import org.apache.camel.builder.RouteBuilder;
> >>> >> >> import org.apache.camel.component.mock.MockEndpoint;
> >>> >> >> import org.apache.camel.impl.JndiRegistry;
> >>> >> >>
> >>> >> >> public class SplitterTryCatchErrorTest extends ContextTestSupport
> {
> >>> >> >>
> >>> >> >>   public void testSplitWithError() throws Exception {
> >>> >> >>        MockEndpoint resultEndpoint =
> getMockEndpoint("mock:error");
> >>> >> >>        resultEndpoint.expectedBodiesReceived("James");
> >>> >> >>
> >>> >> >>        try {
> >>> >> >>            template.sendBody("direct:startWithError",
> "Claus@James
> >>> >> >> @Willem");
> >>> >> >>            //fail("Should have thrown an exception");
> >>> >> >>        } catch (Exception e) {
> >>> >> >>            assertTrue(e.getCause().getMessage().startsWith("This
> is
> >>> a
> >>> >> dummy
> >>> >> >> error James!"));
> >>> >> >>        }
> >>> >> >>
> >>> >> >>        assertMockEndpointsSatisfied();
> >>> >> >>    }
> >>> >> >>
> >>> >> >>
> >>> >> >>    protected JndiRegistry createRegistry() throws Exception {
> >>> >> >>        JndiRegistry jndi = super.createRegistry();
> >>> >> >>        jndi.bind("error", new GenerateError());
> >>> >> >>        return jndi;
> >>> >> >>    }
> >>> >> >>
> >>> >> >>    protected RouteBuilder createRouteBuilder() {
> >>> >> >>        return new RouteBuilder() {
> >>> >> >>            public void configure() {
> >>> >> >>                from("direct:startWithError")
> >>> >> >>                    .split(body().tokenize("@"))
> >>> >> >>                    .doTry()
> >>> >> >>                        // GENERATE A DUMMY ERROR
> >>> >> >>                        .to("bean:error")
> >>> >> >>                        .to("mock:result")
> >>> >> >>                       .doCatch(java.lang.Exception.class)
> >>> >> >>                           .to("mock:error")
> >>> >> >>                    .end();
> >>> >> >>
> >>> >> >>    }
> >>> >> >>
> >>> >> >>    public static final class GenerateError {
> >>> >> >>        public GenerateError() {
> >>> >> >>            // Helper Class
> >>> >> >>        }
> >>> >> >>
> >>> >> >>        public String dummyException(String payload) throws
> Exception
> >>> {
> >>> >> >>            if (payload.equals("James")) {
> >>> >> >>                throw new Exception("This is a dummy error
> James!");
> >>> >> >>            }
> >>> >> >>            return "Hello " + payload;
> >>> >> >>        }
> >>> >> >>
> >>> >> >>    }
> >>> >> >>
> >>> >> >>
> >>> >> >> }
> >>> >> >>
> >>> >> >> What I observe in the log is that the split of the body is done
> and
> >>> each
> >>> >> >> message is processed individually : one for Claus, one for
> Willem.
> >>> For
> >>> >> >> James, a dummy exception is throwed.
> >>> >> >>
> >>> >> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
> >>> >> >> ProducerCache                  - >>>>
> >>> Endpoint[direct://startWithError]
> >>> >> >> Exchange[Message: Claus@James@Willem]
> >>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
> >>> >> >> ProcessorEndpoint$1            - Starting producer:
> >>> >> Producer[bean://error]
> >>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
> >>> >> >> ProducerCache                  - Adding to producer cache with
> key:
> >>> >> >> Endpoint[bean://error] for producer: Producer[bean://error]
> >>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
> >>> >> >> BeanProcessor                  - Setting bean invocation result
> on
> >>> the
> >>> >> IN
> >>> >> >> message: Hello Claus
> >>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
> >>> >> >> BeanProcessor                  - Setting bean invocation result
> on
> >>> the
> >>> >> IN
> >>> >> >> message: Hello Claus
> >>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >>> >> >> MockEndpoint$1                 - Starting producer:
> >>> >> Producer[mock://result]
> >>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >>> >> >> ProducerCache                  - Adding to producer cache with
> key:
> >>> >> >> Endpoint[mock://result] for producer: Producer[mock://result]
> >>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >>> >> >> MockEndpoint                   - mock://result >>>> 1 :
> >>> >> Exchange[Message:
> >>> >> >> Hello Claus] with body: Hello Claus
> >>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >>> >> >> Pipeline                       - Message exchange has failed so
> >>> breaking
> >>> >> out
> >>> >> >> of pipeline: Exchange[Message: James] Exception:
> >>> java.lang.Exception:
> >>> >> This
> >>> >> >> is a dummy error James!
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> MockEndpoint$1                 - Starting producer:
> >>> >> Producer[mock://error]
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> ProducerCache                  - Adding to producer cache with
> key:
> >>> >> >> Endpoint[mock://error] for producer: Producer[mock://error]
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> MockEndpoint                   - mock://error >>>> 1 :
> >>> Exchange[Message:
> >>> >> >> James] with body: James
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> TryProcessor                   - The exception is handled: true
> for
> >>> the
> >>> >> >> exception: java.lang.Exception caused by: This is a dummy error
> >>> James!
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> BeanProcessor                  - Setting bean invocation result
> on
> >>> the
> >>> >> IN
> >>> >> >> message: Hello Willem
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> BeanProcessor                  - Setting bean invocation result
> on
> >>> the
> >>> >> IN
> >>> >> >> message: Hello Willem
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> MockEndpoint                   - mock://result >>>> 2 :
> >>> >> Exchange[Message:
> >>> >> >> Hello Willem] with body: Hello Willem
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> MulticastProcessor             - Done sequientel processing 3
> >>> exchanges
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
> >>> >> >> MockEndpoint                   - Asserting:
> Endpoint[mock://result]
> >>> is
> >>> >> >> satisfied
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
> >>> >> >> MockEndpoint                   - Asserting:
> Endpoint[mock://error]
> >>> is
> >>> >> >> satisfied
> >>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >>> >> >> SplitterTryCatchErrorTest      - tearDown test:
> testSplitWithError
> >>> >> >>
> >>> >> >> The test succeeds but the exception is not catched in the
> try/catch
> >>> >> block of
> >>> >> >> testSplitWithError. What is wrong ?
> >>> >> >>
> >>> >> >> Regards,
> >>> >> >>
> >>> >> >> Charles
> >>> >> >>
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > --
> >>> >> > Claus Ibsen
> >>> >> > Apache Camel Committer
> >>> >> >
> >>> >> > Open Source Integration: http://fusesource.com
> >>> >> > Blog: http://davsclaus.blogspot.com/
> >>> >> > Twitter: http://twitter.com/davsclaus
> >>> >> >
> >>> >>
> >>> >>
> >>> >>
> >>> >> --
> >>> >> Claus Ibsen
> >>> >> Apache Camel Committer
> >>> >>
> >>> >> Open Source Integration: http://fusesource.com
> >>> >> Blog: http://davsclaus.blogspot.com/
> >>> >> Twitter: http://twitter.com/davsclaus
> >>> >>
> >>> >
> >>>
> >>>
> >>>
> >>> --
> >>> Claus Ibsen
> >>> Apache Camel Committer
> >>>
> >>> Open Source Integration: http://fusesource.com
> >>> Blog: http://davsclaus.blogspot.com/
> >>> Twitter: http://twitter.com/davsclaus
> >>>
> >>
> >>
> >
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>

Re: Try/catch with split

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

You need the <split> to span the entire route such as

    <bean id="error"
class="org.apache.camel.issues.TryCatchWithSplitNotHandledIssueTest$GenerateError"/>

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:start"/>
            <split><tokenize token="@"/>
                <doTry>
                    <to uri="bean:error"/>
                    <to uri="mock:result"/>
                    <doCatch>
                        <exception>java.lang.Exception</exception>
                        <handled><constant>false</constant></handled>
                        <to uri="mock:error"/>
                    </doCatch>
                </doTry>
            </split>
        </route>
    </camelContext>


On Fri, Aug 14, 2009 at 3:39 PM, Charles Moulliard<cm...@gmail.com> wrote:
> I try to translate the syntax of Java DSL into Spring DSL.
>
>        <route>
>              <from uri="direct:startWithError"/>
>                   <doTry>
>                   <split>
>                          <tokenize token="@"/>
>                         <bean ref="error"/>
>                         <to uri="mock:result"/>
>                    </split>
>                     <doCatch>
>                        <exception>java.lang.Exception</exception>
>                        <handled>
>                            <constant>false</constant>
>                        </handled>
>                        <to
> uri="log:org.apache.camel.processor?level=INFO&amp;multiline=true&amp;showException=true&amp;showCaughtException=true&amp;showStackTrace=false"/>
>                        <to uri="mock:error"/>
>                      </doCatch>
>                  </doTry>
>        </route>
>
> The following syntax which is accepted is not the correct one because the
> mock:error endpoint does not receive anything when excecuting the test case
> !!
>
> Regards,
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog : http://cmoulliard.blogspot.com
>
>
> On Fri, Aug 14, 2009 at 3:12 PM, Charles Moulliard <cm...@gmail.com>wrote:
>
>> Thx.
>>
>> With the following syntax, it works :
>>
>>    public void testSplitWithError() throws Exception {
>>         MockEndpoint error = getMockEndpoint("mock:error");
>>         error.expectedBodiesReceived("James");
>>         error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>>
>>         MockEndpoint result = getMockEndpoint("mock:result");
>>         result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>>
>>         try {
>>             template.sendBody("direct:startWithError", "Claus@James
>> @Willem");
>>             fail("Exception has been throwed");
>>         } catch (CamelExecutionException ex) {
>>             // Nothing to do
>>         }
>>
>>         assertMockEndpointsSatisfied();
>>     }
>>
>> Regards,
>>
>> Charles Moulliard
>> Senior Enterprise Architect
>> Apache Camel Committer
>>
>> *****************************
>> blog : http://cmoulliard.blogspot.com
>>
>>
>> On Fri, Aug 14, 2009 at 2:52 PM, Claus Ibsen <cl...@gmail.com>wrote:
>>
>>> You need try .. catch around the template when you send a message as
>>> you do NOT handle the exception and thus the client get this exception
>>> back.
>>>
>>>
>>> On Fri, Aug 14, 2009 at 2:43 PM, Charles Moulliard<cm...@gmail.com>
>>> wrote:
>>> > I have adapted the test case as you propose but it fails.
>>> >
>>> > org.apache.camel.CamelExecutionException: Exception occured during
>>> execution
>>> > on the exchange: Exchange[Message: Hello Willem]
>>> >    at
>>> >
>>> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
>>> >    at
>>> >
>>> org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
>>> >    at
>>> >
>>> org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
>>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> >    at
>>> >
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> >    at
>>> >
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> >    at java.lang.reflect.Method.invoke(Method.java:597)
>>> >    at junit.framework.TestCase.runTest(TestCase.java:164)
>>> >    at junit.framework.TestCase.runBare(TestCase.java:130)
>>> >    at junit.framework.TestResult$1.protect(TestResult.java:106)
>>> >    at junit.framework.TestResult.runProtected(TestResult.java:124)
>>> >    at junit.framework.TestResult.run(TestResult.java:109)
>>> >    at junit.framework.TestCase.run(TestCase.java:120)
>>> >    at junit.framework.TestSuite.runTest(TestSuite.java:230)
>>> >    at junit.framework.TestSuite.run(TestSuite.java:225)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
>>> > Caused by: java.lang.Exception: This is a dummy error James!
>>> >    at
>>> >
>>> org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
>>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> >    at
>>> >
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> >    at
>>> >
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> >    at java.lang.reflect.Method.invoke(Method.java:597)
>>> >    at
>>> > org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
>>> >    at
>>> >
>>> org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
>>> >    at
>>> >
>>> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
>>> >    at
>>> >
>>> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
>>> >    at
>>> >
>>> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
>>> >    at
>>> > org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>>> >    at
>>> > org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>>> >    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
>>> >    at
>>> org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
>>> >    at
>>> >
>>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>>> >    at
>>> >
>>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>>> >    at
>>> >
>>> org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
>>> >    at
>>> >
>>> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>>> >    at
>>> >
>>> org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
>>> >    at
>>> >
>>> org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
>>> >    at
>>> >
>>> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
>>> >    at
>>> > org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>>> >    at
>>> > org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
>>> >    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
>>> >    ... 20 more
>>> >
>>> >
>>> >
>>> > CODE ********************************************************
>>> >
>>> > import org.apache.camel.ContextTestSupport;
>>> > import org.apache.camel.Exchange;
>>> > import org.apache.camel.builder.RouteBuilder;
>>> > import org.apache.camel.component.mock.MockEndpoint;
>>> > import org.apache.camel.impl.JndiRegistry;
>>> >
>>> > /**
>>> >  * @version $Revision: 736555 $
>>> >  */
>>> > public class SplitterTryCatchErrorTest extends ContextTestSupport {
>>> >
>>> >   public void testSplitWithError() throws Exception {
>>> >        MockEndpoint error = getMockEndpoint("mock:error");
>>> >        error.expectedBodiesReceived("James");
>>> >
>>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
>>> > is a dummy error James!");
>>> >
>>> >        MockEndpoint result = getMockEndpoint("mock:result");
>>> >        result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>>> >
>>> >        template.sendBody("direct:startWithError", "Claus@James
>>> @Willem");
>>> >
>>> >        assertMockEndpointsSatisfied();
>>> >    }
>>> >
>>> >    protected JndiRegistry createRegistry() throws Exception {
>>> >        JndiRegistry jndi = super.createRegistry();
>>> >        jndi.bind("error", new GenerateError());
>>> >        return jndi;
>>> >    }
>>> >
>>> >    protected RouteBuilder createRouteBuilder() {
>>> >        return new RouteBuilder() {
>>> >            public void configure() {
>>> >                from("direct:startWithError")
>>> >                    .split(body().tokenize("@"))
>>> >                    .doTry()
>>> >                        // GENERATE A DUMMY ERROR
>>> >                        .to("bean:error")
>>> >                        .to("mock:result")
>>> >                       .doCatch(java.lang.Exception.class).handled(false)
>>> >
>>> >
>>> .to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
>>> >                           .to("mock:error")
>>> >                    .end();
>>> >            }
>>> >        };
>>> >    }
>>> >
>>> >    public static final class GenerateError {
>>> >        public GenerateError() {
>>> >            // Helper Class
>>> >        }
>>> >
>>> >        public String dummyException(String payload) throws Exception {
>>> >            if (payload.equals("James")) {
>>> >                throw new Exception("This is a dummy error James!");
>>> >            }
>>> >            return "Hello " + payload;
>>> >        }
>>> >
>>> >    }
>>> >
>>> >
>>> > }
>>> >
>>> > ********************************************
>>> >
>>> > Here is the trace of the log
>>> >
>>> > 2009-08-14 14:34:57,726 [main           ] INFO
>>> > DefaultCamelContext            - JMX enabled. Using
>>> > InstrumentationLifecycleStrategy.
>>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
>>> > SplitterTryCatchErrorTest      - Using created route builder: Routes: []
>>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
>>> > DefaultCamelContext            - Adding routes from builder: Routes: []
>>> > 2009-08-14 14:34:58,132 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
>>> > starting
>>> > 2009-08-14 14:34:58,132 [main           ] DEBUG
>>> > DefaultProducerServicePool     - Starting service pool:
>>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
>>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: direct via type:
>>> > org.apache.camel.component.direct.DirectComponent via:
>>> > META-INF/services/org/apache/camel/component/direct
>>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint
>>> > uri=[direct://startWithError], path=[startWithError], parameters=[{}]
>>> > 2009-08-14 14:34:58,616 [main           ] DEBUG
>>> > DefaultCamelContext            - direct://startWithError converted to
>>> > endpoint: Endpoint[direct://startWithError] by component:
>>> > org.apache.camel.component.direct.DirectComponent@1e0f2f6
>>> > 2009-08-14 14:34:58,695 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: bean via type:
>>> > org.apache.camel.component.bean.BeanComponent via:
>>> > META-INF/services/org/apache/camel/component/bean
>>> > 2009-08-14 14:34:58,710 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint uri=[bean://error],
>>> > path=[error], parameters=[{}]
>>> > 2009-08-14 14:34:58,726 [main           ] DEBUG
>>> > DefaultCamelContext            - bean://error converted to endpoint:
>>> > Endpoint[bean://error] by component:
>>> > org.apache.camel.component.bean.BeanComponent@1c0f2e5
>>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: mock via type:
>>> > org.apache.camel.component.mock.MockComponent via:
>>> > META-INF/services/org/apache/camel/component/mock
>>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint uri=[mock://result],
>>> > path=[result], parameters=[{}]
>>> > 2009-08-14 14:34:58,788 [main           ] DEBUG
>>> > DefaultCamelContext            - mock://result converted to endpoint:
>>> > Endpoint[mock://result] by component:
>>> > org.apache.camel.component.mock.MockComponent@1977b9b
>>> > 2009-08-14 14:34:58,835 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: log via type:
>>> > org.apache.camel.component.log.LogComponent via:
>>> > META-INF/services/org/apache/camel/component/log
>>> > 2009-08-14 14:34:58,851 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint
>>> >
>>> uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
>>> > path=[org.apache.camel.processor], parameters=[{level=INFO,
>>> multiline=true,
>>> > showCaughtException=true, showException=true, showStackTrace=false}]
>>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>>> > DefaultCamelContext            -
>>> >
>>> log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
>>> > converted to endpoint:
>>> >
>>> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > by component: org.apache.camel.component.log.LogComponent@1a7ddcf
>>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint uri=[mock://error],
>>> > path=[error], parameters=[{}]
>>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>>> > DefaultCamelContext            - mock://error converted to endpoint:
>>> > Endpoint[mock://error] by component:
>>> > org.apache.camel.component.mock.MockComponent@1977b9b
>>> > 2009-08-14 14:34:58,976 [main           ] DEBUG
>>> > DefaultCamelContext            - Starting routes
>>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>>> > DirectConsumer                 - Starting consumer:
>>> > Consumer[direct://startWithError]
>>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>>> > DefaultCamelContext            - Route 0:
>>> > EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
>>> > UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
>>> > {Pipeline[Channel[sendTo(Endpoint[bean://error])],
>>> > Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
>>> > java.lang.Exception] ->
>>> >
>>> Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
>>> > Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
>>> > useLatestAggregationStrategy]])]
>>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>>> > DefaultCamelContext            - Started routes
>>> > 2009-08-14 14:34:59,116 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>>> > started
>>> > 2009-08-14 14:34:59,163 [main           ] DEBUG
>>> > DirectProducer                 - Starting producer:
>>> > Producer[direct://startWithError]
>>> > 2009-08-14 14:34:59,179 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[direct://startWithError] for producer:
>>> > Producer[direct://startWithError]
>>> > 2009-08-14 14:34:59,304 [main           ] DEBUG
>>> > ProducerCache                  - >>>> Endpoint[direct://startWithError]
>>> > Exchange[Message: Claus@James@Willem]
>>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
>>> > ProcessorEndpoint$1            - Starting producer:
>>> Producer[bean://error]
>>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[bean://error] for producer: Producer[bean://error]
>>> > 2009-08-14 14:35:00,726 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.component.file.GenericFileConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.StaticMethodWithExchangeTestConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.CamelConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.CollectionConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.IOConverter
>>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.DomConverter
>>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.StaxConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.StreamSourceConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.XmlConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.NIOConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.ObjectConverter
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.stream.StreamCacheConverter
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Claus
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Claus
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > MockEndpoint$1                 - Starting producer:
>>> Producer[mock://result]
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[mock://result] for producer: Producer[mock://result]
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > MockEndpoint                   - mock://result >>>> 1 :
>>> Exchange[Message:
>>> > Hello Claus] with body: Hello Claus
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > Pipeline                       - Message exchange has failed so breaking
>>> out
>>> > of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
>>> This
>>> > is a dummy error James!
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > ProcessorEndpoint$1            - Starting producer:
>>> >
>>> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> >
>>> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > for producer:
>>> >
>>> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > 2009-08-14 14:35:00,835 [main           ] INFO
>>> > processor                      - Exchange[
>>> > , BodyType:String
>>> > , Body:James
>>> > , CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This
>>> is a
>>> > dummy error James!]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MockEndpoint$1                 - Starting producer:
>>> Producer[mock://error]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[mock://error] for producer: Producer[mock://error]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
>>> > James] with body: James
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > TryProcessor                   - The exception is handled: false for the
>>> > exception: java.lang.Exception caused by: This is a dummy error James!
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - Failed delivery for exchangeId:
>>> > ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0 caught:
>>> > java.lang.Exception: This is a dummy error James!
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - This exchange is not handled so its
>>> marked
>>> > as failed: Exchange[Message: James]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Willem
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Willem
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MockEndpoint                   - mock://result >>>> 2 :
>>> Exchange[Message:
>>> > Hello Willem] with body: Hello Willem
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MulticastProcessor             - Done sequientel processing 3 exchanges
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - Failed delivery for exchangeId:
>>> > ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0 caught:
>>> > java.lang.Exception: This is a dummy error James!
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - This exchange is not handled so its
>>> marked
>>> > as failed: Exchange[Message: Hello Willem]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>>> > 2009-08-14 14:35:00,835 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
>>> > stopping
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DirectConsumer                 - Stopping consumer:
>>> > Consumer[direct://startWithError]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultProducerServicePool     - Stopping service pool:
>>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
>>> > 2009-08-14 14:35:00,835 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>>> > stopped
>>> >
>>> > Regards,
>>> >
>>> > Charles Moulliard
>>> > Senior Enterprise Architect
>>> > Apache Camel Committer
>>> >
>>> > *****************************
>>> > blog : http://cmoulliard.blogspot.com
>>> >
>>> >
>>> > On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <cl...@gmail.com>
>>> wrote:
>>> >
>>> >> Hi
>>> >>
>>> >> But Camel is smart and flexible so it allows you to lower the handled
>>> >> flag on doCatch (noticed handled(false)) so you can do like this, in
>>> >> which the client will get the exception back in his face. And the
>>> >> mock:error can see the caused exception from a property on the
>>> >> exchange
>>> >>
>>> >>        MockEndpoint error = getMockEndpoint("mock:error");
>>> >>        error.expectedBodiesReceived("James");
>>> >>
>>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>>> >>
>>> >>
>>> >>                from("direct:start")
>>> >>                    .split(body().tokenize("@"))
>>> >>                    .doTry()
>>> >>                         .to("bean:error")
>>> >>                        .to("mock:result")
>>> >>                     .doCatch(Exception.class).handled(false)
>>> >>                        .to("mock:error")
>>> >>                    .end();
>>> >>
>>> >>
>>> >> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com>
>>> >> wrote:
>>> >> > Hi
>>> >> >
>>> >> > Works fine I will commit an unit test later when Hadrian is done with
>>> >> > the build of Camel 2.0 release.
>>> >> >
>>> >> > 2 messages goes to mock:result
>>> >> > 1 message go to mock:error
>>> >> >
>>> >> > All as expected.
>>> >> >
>>> >> > Since you use doTry .. doCatch the client will not receive any
>>> >> > exception as he will not do that either when you do
>>> >> >
>>> >> > try {
>>> >> >
>>> >> > } catch (Exception e) {
>>> >> >  .. do something
>>> >> > }
>>> >> >
>>> >> > Since you do NOT rethrow the exception in the catch block. Catching
>>> an
>>> >> > exception is like handling it = NO MORE AN EXCEPTION
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<
>>> cmoulliard@gmail.com>
>>> >> wrote:
>>> >> >> Hi,
>>> >> >>
>>> >> >> I'm back again with try/catch and split. I have created the
>>> following
>>> >> unit
>>> >> >> test who seems to work but I don't understand why the try/catch
>>> block of
>>> >> the
>>> >> >> test does not receive the error ?
>>> >> >>
>>> >> >> Code
>>> >> >>
>>> >> >> package org.apache.camel.processor;
>>> >> >>
>>> >> >> import org.apache.camel.ContextTestSupport;
>>> >> >> // import org.apache.camel.RuntimeCamelException;
>>> >> >> import org.apache.camel.builder.RouteBuilder;
>>> >> >> import org.apache.camel.component.mock.MockEndpoint;
>>> >> >> import org.apache.camel.impl.JndiRegistry;
>>> >> >>
>>> >> >> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>>> >> >>
>>> >> >>   public void testSplitWithError() throws Exception {
>>> >> >>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
>>> >> >>        resultEndpoint.expectedBodiesReceived("James");
>>> >> >>
>>> >> >>        try {
>>> >> >>            template.sendBody("direct:startWithError", "Claus@James
>>> >> >> @Willem");
>>> >> >>            //fail("Should have thrown an exception");
>>> >> >>        } catch (Exception e) {
>>> >> >>            assertTrue(e.getCause().getMessage().startsWith("This is
>>> a
>>> >> dummy
>>> >> >> error James!"));
>>> >> >>        }
>>> >> >>
>>> >> >>        assertMockEndpointsSatisfied();
>>> >> >>    }
>>> >> >>
>>> >> >>
>>> >> >>    protected JndiRegistry createRegistry() throws Exception {
>>> >> >>        JndiRegistry jndi = super.createRegistry();
>>> >> >>        jndi.bind("error", new GenerateError());
>>> >> >>        return jndi;
>>> >> >>    }
>>> >> >>
>>> >> >>    protected RouteBuilder createRouteBuilder() {
>>> >> >>        return new RouteBuilder() {
>>> >> >>            public void configure() {
>>> >> >>                from("direct:startWithError")
>>> >> >>                    .split(body().tokenize("@"))
>>> >> >>                    .doTry()
>>> >> >>                        // GENERATE A DUMMY ERROR
>>> >> >>                        .to("bean:error")
>>> >> >>                        .to("mock:result")
>>> >> >>                       .doCatch(java.lang.Exception.class)
>>> >> >>                           .to("mock:error")
>>> >> >>                    .end();
>>> >> >>
>>> >> >>    }
>>> >> >>
>>> >> >>    public static final class GenerateError {
>>> >> >>        public GenerateError() {
>>> >> >>            // Helper Class
>>> >> >>        }
>>> >> >>
>>> >> >>        public String dummyException(String payload) throws Exception
>>> {
>>> >> >>            if (payload.equals("James")) {
>>> >> >>                throw new Exception("This is a dummy error James!");
>>> >> >>            }
>>> >> >>            return "Hello " + payload;
>>> >> >>        }
>>> >> >>
>>> >> >>    }
>>> >> >>
>>> >> >>
>>> >> >> }
>>> >> >>
>>> >> >> What I observe in the log is that the split of the body is done and
>>> each
>>> >> >> message is processed individually : one for Claus, one for Willem.
>>> For
>>> >> >> James, a dummy exception is throwed.
>>> >> >>
>>> >> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
>>> >> >> ProducerCache                  - >>>>
>>> Endpoint[direct://startWithError]
>>> >> >> Exchange[Message: Claus@James@Willem]
>>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>>> >> >> ProcessorEndpoint$1            - Starting producer:
>>> >> Producer[bean://error]
>>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>>> >> >> ProducerCache                  - Adding to producer cache with key:
>>> >> >> Endpoint[bean://error] for producer: Producer[bean://error]
>>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Claus
>>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Claus
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> MockEndpoint$1                 - Starting producer:
>>> >> Producer[mock://result]
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> ProducerCache                  - Adding to producer cache with key:
>>> >> >> Endpoint[mock://result] for producer: Producer[mock://result]
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> MockEndpoint                   - mock://result >>>> 1 :
>>> >> Exchange[Message:
>>> >> >> Hello Claus] with body: Hello Claus
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> Pipeline                       - Message exchange has failed so
>>> breaking
>>> >> out
>>> >> >> of pipeline: Exchange[Message: James] Exception:
>>> java.lang.Exception:
>>> >> This
>>> >> >> is a dummy error James!
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MockEndpoint$1                 - Starting producer:
>>> >> Producer[mock://error]
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> ProducerCache                  - Adding to producer cache with key:
>>> >> >> Endpoint[mock://error] for producer: Producer[mock://error]
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MockEndpoint                   - mock://error >>>> 1 :
>>> Exchange[Message:
>>> >> >> James] with body: James
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> TryProcessor                   - The exception is handled: true for
>>> the
>>> >> >> exception: java.lang.Exception caused by: This is a dummy error
>>> James!
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Willem
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Willem
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MockEndpoint                   - mock://result >>>> 2 :
>>> >> Exchange[Message:
>>> >> >> Hello Willem] with body: Hello Willem
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MulticastProcessor             - Done sequientel processing 3
>>> exchanges
>>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
>>> >> >> MockEndpoint                   - Asserting: Endpoint[mock://result]
>>> is
>>> >> >> satisfied
>>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
>>> >> >> MockEndpoint                   - Asserting: Endpoint[mock://error]
>>> is
>>> >> >> satisfied
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>>> >> >>
>>> >> >> The test succeeds but the exception is not catched in the try/catch
>>> >> block of
>>> >> >> testSplitWithError. What is wrong ?
>>> >> >>
>>> >> >> Regards,
>>> >> >>
>>> >> >> Charles
>>> >> >>
>>> >> >
>>> >> >
>>> >> >
>>> >> > --
>>> >> > Claus Ibsen
>>> >> > Apache Camel Committer
>>> >> >
>>> >> > Open Source Integration: http://fusesource.com
>>> >> > Blog: http://davsclaus.blogspot.com/
>>> >> > Twitter: http://twitter.com/davsclaus
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Claus Ibsen
>>> >> Apache Camel Committer
>>> >>
>>> >> Open Source Integration: http://fusesource.com
>>> >> Blog: http://davsclaus.blogspot.com/
>>> >> Twitter: http://twitter.com/davsclaus
>>> >>
>>> >
>>>
>>>
>>>
>>> --
>>> Claus Ibsen
>>> Apache Camel Committer
>>>
>>> Open Source Integration: http://fusesource.com
>>> Blog: http://davsclaus.blogspot.com/
>>> Twitter: http://twitter.com/davsclaus
>>>
>>
>>
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Re: Try/catch with split

Posted by Charles Moulliard <cm...@gmail.com>.
Here is a new case that I test using direct as endpoint between split and
try/catch block. This becomes crazy and in this case, the mock:error
receives three times the error and the mock result nothing. I think that in
this case, the exchanges are processed separately and we lost the loop
available in the split

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
              <from uri="direct:startWithError"/>
                   <split>
                          <tokenize token="@"/>
                        <to uri="direct:checkToken"/>
                   </split>
        </route>
        <route>
             <from uri="direct:checkToken"/>
                    <doTry>
                         <bean ref="error"/>
                         <to uri="mock:result"/>
                     <doCatch>
                        <exception>java.lang.Exception</exception>
                        <handled>
                            <constant>false</constant>
                        </handled>
                        <to
uri="log:org.apache.camel.processor?level=INFO&amp;multiline=true&amp;showException=true&amp;showCaughtException=true&amp;showStackTrace=false"/>
                        <to uri="mock:error"/>
                      </doCatch>
                  </doTry>
        </route>


Here is the log generated :

2009-08-14 17:22:37,085 [main           ] DEBUG
DefaultCamelContext            - Started routes
2009-08-14 17:22:37,085 [main           ] INFO
DefaultCamelContext            - Apache Camel  (CamelContext:camel) started
2009-08-14 17:22:37,226 [main           ] DEBUG
DefaultListableBeanFactory     - Returning cached instance of singleton bean
'camel'
2009-08-14 17:22:37,257 [main           ] DEBUG
pringSplitterTryCatchErrorTest - isUseRouteBuilder() is false
2009-08-14 17:22:37,304 [main           ] DEBUG
DirectProducer                 - Starting producer:
Producer[direct://startWithError]
2009-08-14 17:22:37,320 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[direct://startWithError] for producer:
Producer[direct://startWithError]
2009-08-14 17:22:37,320 [main           ] DEBUG
ProducerCache                  - >>>> Endpoint[direct://startWithError]
Exchange[Message: Claus@James@Willem]
2009-08-14 17:22:37,382 [main           ] DEBUG
DirectProducer                 - Starting producer:
Producer[direct://checkToken]
2009-08-14 17:22:37,382 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[direct://checkToken] for producer: Producer[direct://checkToken]
2009-08-14 17:22:37,382 [main           ] DEBUG
DefaultListableBeanFactory     - Returning cached instance of singleton bean
'error'
2009-08-14 17:22:39,679 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.component.file.GenericFileConverter
2009-08-14 17:22:39,710 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.CamelConverter
2009-08-14 17:22:39,710 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.CollectionConverter
2009-08-14 17:22:39,710 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.IOConverter
2009-08-14 17:22:39,741 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.DomConverter
2009-08-14 17:22:39,741 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.StaxConverter
2009-08-14 17:22:39,741 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.StreamSourceConverter
2009-08-14 17:22:39,741 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.XmlConverter
2009-08-14 17:22:39,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.NIOConverter
2009-08-14 17:22:39,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.ObjectConverter
2009-08-14 17:22:39,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.stream.StreamCacheConverter
2009-08-14 17:22:39,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
2009-08-14 17:22:39,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.StaticMethodWithExchangeTestConverter
2009-08-14 17:22:39,788 [main           ] DEBUG
Pipeline                       - Message exchange has failed so breaking out
of pipeline: Exchange[Message: Claus] Exception: java.lang.Exception: This
is a dummy error !
2009-08-14 17:22:39,804 [main           ] DEBUG
ProcessorEndpoint$1            - Starting producer:
Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
2009-08-14 17:22:39,804 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
for producer:
Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
2009-08-14 17:22:39,820 [main           ] INFO
processor                      - Exchange[
, BodyType:String
, Body:Claus
, CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This is a
dummy error !]
2009-08-14 17:22:39,835 [main           ] DEBUG
MockEndpoint$1                 - Starting producer: Producer[mock://error]
2009-08-14 17:22:39,835 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[mock://error] for producer: Producer[mock://error]
2009-08-14 17:22:39,835 [main           ] DEBUG
MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
Claus] with body: Claus
2009-08-14 17:22:39,835 [main           ] DEBUG
TryProcessor                   - The exception is handled: false for the
exception: java.lang.Exception caused by: This is a dummy error !
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultErrorHandler            - Failed delivery for exchangeId:
ID-dell-charles-2207-1250263357116-0-1. On delivery attempt: 0 caught:
java.lang.Exception: This is a dummy error !
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultErrorHandler            - This exchange is not handled so its marked
as failed: Exchange[Message: Claus]
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultListableBeanFactory     - Returning cached instance of singleton bean
'error'
2009-08-14 17:22:39,835 [main           ] DEBUG
Pipeline                       - Message exchange has failed so breaking out
of pipeline: Exchange[Message: James] Exception: java.lang.Exception: This
is a dummy error !
2009-08-14 17:22:39,835 [main           ] INFO
processor                      - Exchange[
, BodyType:String
, Body:James
, CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This is a
dummy error !]
2009-08-14 17:22:39,835 [main           ] DEBUG
MockEndpoint                   - mock://error >>>> 2 : Exchange[Message:
James] with body: James
2009-08-14 17:22:39,835 [main           ] DEBUG
TryProcessor                   - The exception is handled: false for the
exception: java.lang.Exception caused by: This is a dummy error !
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultErrorHandler            - Failed delivery for exchangeId:
ID-dell-charles-2207-1250263357116-0-3. On delivery attempt: 0 caught:
java.lang.Exception: This is a dummy error !
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultErrorHandler            - This exchange is not handled so its marked
as failed: Exchange[Message: James]
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultListableBeanFactory     - Returning cached instance of singleton bean
'error'
2009-08-14 17:22:39,835 [main           ] DEBUG
Pipeline                       - Message exchange has failed so breaking out
of pipeline: Exchange[Message: Willem] Exception: java.lang.Exception: This
is a dummy error !
2009-08-14 17:22:39,835 [main           ] INFO
processor                      - Exchange[
, BodyType:String
, Body:Willem
, CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This is a
dummy error !]
2009-08-14 17:22:39,835 [main           ] DEBUG
MockEndpoint                   - mock://error >>>> 3 : Exchange[Message:
Willem] with body: Willem
2009-08-14 17:22:39,835 [main           ] DEBUG
TryProcessor                   - The exception is handled: false for the
exception: java.lang.Exception caused by: This is a dummy error !
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultErrorHandler            - Failed delivery for exchangeId:
ID-dell-charles-2207-1250263357116-0-5. On delivery attempt: 0 caught:
java.lang.Exception: This is a dummy error !
2009-08-14 17:22:39,835 [main           ] DEBUG
DefaultErrorHandler            - This exchange is not handled so its marked
as failed: Exchange[Message: Willem]
2009-08-14 17:22:39,835 [main           ] DEBUG
MulticastProcessor             - Done sequientel processing 3 exchanges
2009-08-14 17:22:39,851 [main           ] INFO
MockEndpoint                   - Asserting: Endpoint[mock://result] is
satisfied
2009-08-14 17:22:39,851 [main           ] DEBUG
MockEndpoint                   - Waiting on the latch for: 0 millis
2009-08-14 17:22:54,741 [main           ] DEBUG
MockEndpoint                   - Took 14890 millis to complete latch
2009-08-14 17:22:54,741 [main           ] DEBUG
pringSplitterTryCatchErrorTest - tearDown test: testSplitWithError
2009-08-14 17:22:54,741 [main           ] DEBUG
SpringCamelContext             - onApplicationEvent:
org.springframework.context.event.ContextStoppedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@16fe0f4:
display name
[org.springframework.context.support.ClassPathXmlApplicationContext@16fe0f4];
startup date [Fri Aug 14 17:22:32 CEST 2009]; root of context hierarchy]


On Fri, Aug 14, 2009 at 3:39 PM, Charles Moulliard <cm...@gmail.com>wrote:

> I try to translate the syntax of Java DSL into Spring DSL.
>
>         <route>
>               <from uri="direct:startWithError"/>
>                    <doTry>
>                    <split>
>                           <tokenize token="@"/>
>                          <bean ref="error"/>
>                          <to uri="mock:result"/>
>                     </split>
>                      <doCatch>
>                         <exception>java.lang.Exception</exception>
>                         <handled>
>                             <constant>false</constant>
>                         </handled>
>                         <to
> uri="log:org.apache.camel.processor?level=INFO&amp;multiline=true&amp;showException=true&amp;showCaughtException=true&amp;showStackTrace=false"/>
>                         <to uri="mock:error"/>
>                       </doCatch>
>                   </doTry>
>         </route>
>
> The following syntax which is accepted is not the correct one because the
> mock:error endpoint does not receive anything when excecuting the test case
> !!
>
> Regards,
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog : http://cmoulliard.blogspot.com
>
>
> On Fri, Aug 14, 2009 at 3:12 PM, Charles Moulliard <cm...@gmail.com>wrote:
>
>> Thx.
>>
>> With the following syntax, it works :
>>
>>    public void testSplitWithError() throws Exception {
>>         MockEndpoint error = getMockEndpoint("mock:error");
>>         error.expectedBodiesReceived("James");
>>          error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>>
>>         MockEndpoint result = getMockEndpoint("mock:result");
>>         result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>>
>>         try {
>>             template.sendBody("direct:startWithError", "Claus@James
>> @Willem");
>>             fail("Exception has been throwed");
>>         } catch (CamelExecutionException ex) {
>>             // Nothing to do
>>         }
>>
>>         assertMockEndpointsSatisfied();
>>     }
>>
>> Regards,
>>
>> Charles Moulliard
>> Senior Enterprise Architect
>> Apache Camel Committer
>>
>> *****************************
>> blog : http://cmoulliard.blogspot.com
>>
>>
>> On Fri, Aug 14, 2009 at 2:52 PM, Claus Ibsen <cl...@gmail.com>wrote:
>>
>>> You need try .. catch around the template when you send a message as
>>> you do NOT handle the exception and thus the client get this exception
>>> back.
>>>
>>>
>>> On Fri, Aug 14, 2009 at 2:43 PM, Charles Moulliard<cm...@gmail.com>
>>> wrote:
>>> > I have adapted the test case as you propose but it fails.
>>> >
>>> > org.apache.camel.CamelExecutionException: Exception occured during
>>> execution
>>> > on the exchange: Exchange[Message: Hello Willem]
>>> >    at
>>> >
>>> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
>>> >    at
>>> >
>>> org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
>>> >    at
>>> >
>>> org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
>>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> >    at
>>> >
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> >    at
>>> >
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> >    at java.lang.reflect.Method.invoke(Method.java:597)
>>> >    at junit.framework.TestCase.runTest(TestCase.java:164)
>>> >    at junit.framework.TestCase.runBare(TestCase.java:130)
>>> >    at junit.framework.TestResult$1.protect(TestResult.java:106)
>>> >    at junit.framework.TestResult.runProtected(TestResult.java:124)
>>> >    at junit.framework.TestResult.run(TestResult.java:109)
>>> >    at junit.framework.TestCase.run(TestCase.java:120)
>>> >    at junit.framework.TestSuite.runTest(TestSuite.java:230)
>>> >    at junit.framework.TestSuite.run(TestSuite.java:225)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>>> >    at
>>> >
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
>>> > Caused by: java.lang.Exception: This is a dummy error James!
>>> >    at
>>> >
>>> org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
>>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> >    at
>>> >
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> >    at
>>> >
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> >    at java.lang.reflect.Method.invoke(Method.java:597)
>>> >    at
>>> > org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
>>> >    at
>>> >
>>> org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
>>> >    at
>>> >
>>> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
>>> >    at
>>> >
>>> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
>>> >    at
>>> >
>>> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>>> >    at
>>> > org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>>> >    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
>>> >    at
>>> org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
>>> >    at
>>> >
>>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>>> >    at
>>> >
>>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>>> >    at
>>> >
>>> org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
>>> >    at
>>> >
>>> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>>> >    at
>>> >
>>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>>> >    at
>>> >
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>>> >    at
>>> >
>>> org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
>>> >    at
>>> >
>>> org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
>>> >    at
>>> >
>>> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>>> >    at
>>> >
>>> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
>>> >    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
>>> >    at
>>> >
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
>>> >    ... 20 more
>>> >
>>> >
>>> >
>>> > CODE ********************************************************
>>> >
>>> > import org.apache.camel.ContextTestSupport;
>>> > import org.apache.camel.Exchange;
>>> > import org.apache.camel.builder.RouteBuilder;
>>> > import org.apache.camel.component.mock.MockEndpoint;
>>> > import org.apache.camel.impl.JndiRegistry;
>>> >
>>> > /**
>>> >  * @version $Revision: 736555 $
>>> >  */
>>> > public class SplitterTryCatchErrorTest extends ContextTestSupport {
>>> >
>>> >   public void testSplitWithError() throws Exception {
>>> >        MockEndpoint error = getMockEndpoint("mock:error");
>>> >        error.expectedBodiesReceived("James");
>>> >
>>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
>>> > is a dummy error James!");
>>> >
>>> >        MockEndpoint result = getMockEndpoint("mock:result");
>>> >        result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>>> >
>>> >        template.sendBody("direct:startWithError", "Claus@James
>>> @Willem");
>>> >
>>> >        assertMockEndpointsSatisfied();
>>> >    }
>>> >
>>> >    protected JndiRegistry createRegistry() throws Exception {
>>> >        JndiRegistry jndi = super.createRegistry();
>>> >        jndi.bind("error", new GenerateError());
>>> >        return jndi;
>>> >    }
>>> >
>>> >    protected RouteBuilder createRouteBuilder() {
>>> >        return new RouteBuilder() {
>>> >            public void configure() {
>>> >                from("direct:startWithError")
>>> >                    .split(body().tokenize("@"))
>>> >                    .doTry()
>>> >                        // GENERATE A DUMMY ERROR
>>> >                        .to("bean:error")
>>> >                        .to("mock:result")
>>> >
>>> .doCatch(java.lang.Exception.class).handled(false)
>>> >
>>> >
>>> .to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
>>> >                           .to("mock:error")
>>> >                    .end();
>>> >            }
>>> >        };
>>> >    }
>>> >
>>> >    public static final class GenerateError {
>>> >        public GenerateError() {
>>> >            // Helper Class
>>> >        }
>>> >
>>> >        public String dummyException(String payload) throws Exception {
>>> >            if (payload.equals("James")) {
>>> >                throw new Exception("This is a dummy error James!");
>>> >            }
>>> >            return "Hello " + payload;
>>> >        }
>>> >
>>> >    }
>>> >
>>> >
>>> > }
>>> >
>>> > ********************************************
>>> >
>>> > Here is the trace of the log
>>> >
>>> > 2009-08-14 14:34:57,726 [main           ] INFO
>>> > DefaultCamelContext            - JMX enabled. Using
>>> > InstrumentationLifecycleStrategy.
>>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
>>> > SplitterTryCatchErrorTest      - Using created route builder: Routes:
>>> []
>>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
>>> > DefaultCamelContext            - Adding routes from builder: Routes: []
>>> > 2009-08-14 14:34:58,132 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>>> is
>>> > starting
>>> > 2009-08-14 14:34:58,132 [main           ] DEBUG
>>> > DefaultProducerServicePool     - Starting service pool:
>>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
>>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: direct via type:
>>> > org.apache.camel.component.direct.DirectComponent via:
>>> > META-INF/services/org/apache/camel/component/direct
>>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint
>>> > uri=[direct://startWithError], path=[startWithError], parameters=[{}]
>>> > 2009-08-14 14:34:58,616 [main           ] DEBUG
>>> > DefaultCamelContext            - direct://startWithError converted to
>>> > endpoint: Endpoint[direct://startWithError] by component:
>>> > org.apache.camel.component.direct.DirectComponent@1e0f2f6
>>> > 2009-08-14 14:34:58,695 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: bean via type:
>>> > org.apache.camel.component.bean.BeanComponent via:
>>> > META-INF/services/org/apache/camel/component/bean
>>> > 2009-08-14 14:34:58,710 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint uri=[bean://error],
>>> > path=[error], parameters=[{}]
>>> > 2009-08-14 14:34:58,726 [main           ] DEBUG
>>> > DefaultCamelContext            - bean://error converted to endpoint:
>>> > Endpoint[bean://error] by component:
>>> > org.apache.camel.component.bean.BeanComponent@1c0f2e5
>>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: mock via type:
>>> > org.apache.camel.component.mock.MockComponent via:
>>> > META-INF/services/org/apache/camel/component/mock
>>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint uri=[mock://result],
>>> > path=[result], parameters=[{}]
>>> > 2009-08-14 14:34:58,788 [main           ] DEBUG
>>> > DefaultCamelContext            - mock://result converted to endpoint:
>>> > Endpoint[mock://result] by component:
>>> > org.apache.camel.component.mock.MockComponent@1977b9b
>>> > 2009-08-14 14:34:58,835 [main           ] DEBUG
>>> > DefaultComponentResolver       - Found component: log via type:
>>> > org.apache.camel.component.log.LogComponent via:
>>> > META-INF/services/org/apache/camel/component/log
>>> > 2009-08-14 14:34:58,851 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint
>>> >
>>> uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
>>> > path=[org.apache.camel.processor], parameters=[{level=INFO,
>>> multiline=true,
>>> > showCaughtException=true, showException=true, showStackTrace=false}]
>>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>>> > DefaultCamelContext            -
>>> >
>>> log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
>>> > converted to endpoint:
>>> >
>>> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > by component: org.apache.camel.component.log.LogComponent@1a7ddcf
>>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>>> > DefaultComponent               - Creating endpoint uri=[mock://error],
>>> > path=[error], parameters=[{}]
>>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>>> > DefaultCamelContext            - mock://error converted to endpoint:
>>> > Endpoint[mock://error] by component:
>>> > org.apache.camel.component.mock.MockComponent@1977b9b
>>> > 2009-08-14 14:34:58,976 [main           ] DEBUG
>>> > DefaultCamelContext            - Starting routes
>>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>>> > DirectConsumer                 - Starting consumer:
>>> > Consumer[direct://startWithError]
>>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>>> > DefaultCamelContext            - Route 0:
>>> > EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
>>> > UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
>>> > {Pipeline[Channel[sendTo(Endpoint[bean://error])],
>>> > Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
>>> > java.lang.Exception] ->
>>> >
>>> Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
>>> > Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
>>> > useLatestAggregationStrategy]])]
>>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>>> > DefaultCamelContext            - Started routes
>>> > 2009-08-14 14:34:59,116 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>>> > started
>>> > 2009-08-14 14:34:59,163 [main           ] DEBUG
>>> > DirectProducer                 - Starting producer:
>>> > Producer[direct://startWithError]
>>> > 2009-08-14 14:34:59,179 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[direct://startWithError] for producer:
>>> > Producer[direct://startWithError]
>>> > 2009-08-14 14:34:59,304 [main           ] DEBUG
>>> > ProducerCache                  - >>>> Endpoint[direct://startWithError]
>>> > Exchange[Message: Claus@James@Willem]
>>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
>>> > ProcessorEndpoint$1            - Starting producer:
>>> Producer[bean://error]
>>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[bean://error] for producer: Producer[bean://error]
>>> > 2009-08-14 14:35:00,726 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.component.file.GenericFileConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.StaticMethodWithExchangeTestConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.CamelConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.CollectionConverter
>>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.IOConverter
>>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.DomConverter
>>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.StaxConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.StreamSourceConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.jaxp.XmlConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.NIOConverter
>>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.ObjectConverter
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > AnnotationTypeConverterLoader  - Loading converter class:
>>> > org.apache.camel.converter.stream.StreamCacheConverter
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Claus
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Claus
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > MockEndpoint$1                 - Starting producer:
>>> Producer[mock://result]
>>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[mock://result] for producer: Producer[mock://result]
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > MockEndpoint                   - mock://result >>>> 1 :
>>> Exchange[Message:
>>> > Hello Claus] with body: Hello Claus
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > Pipeline                       - Message exchange has failed so
>>> breaking out
>>> > of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
>>> This
>>> > is a dummy error James!
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > ProcessorEndpoint$1            - Starting producer:
>>> >
>>> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> >
>>> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > for producer:
>>> >
>>> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>>> > 2009-08-14 14:35:00,835 [main           ] INFO
>>> > processor                      - Exchange[
>>> > , BodyType:String
>>> > , Body:James
>>> > , CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This
>>> is a
>>> > dummy error James!]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MockEndpoint$1                 - Starting producer:
>>> Producer[mock://error]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > ProducerCache                  - Adding to producer cache with key:
>>> > Endpoint[mock://error] for producer: Producer[mock://error]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MockEndpoint                   - mock://error >>>> 1 :
>>> Exchange[Message:
>>> > James] with body: James
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > TryProcessor                   - The exception is handled: false for
>>> the
>>> > exception: java.lang.Exception caused by: This is a dummy error James!
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - Failed delivery for exchangeId:
>>> > ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0 caught:
>>> > java.lang.Exception: This is a dummy error James!
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - This exchange is not handled so its
>>> marked
>>> > as failed: Exchange[Message: James]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Willem
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > BeanProcessor                  - Setting bean invocation result on the
>>> IN
>>> > message: Hello Willem
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MockEndpoint                   - mock://result >>>> 2 :
>>> Exchange[Message:
>>> > Hello Willem] with body: Hello Willem
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > MulticastProcessor             - Done sequientel processing 3 exchanges
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - Failed delivery for exchangeId:
>>> > ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0 caught:
>>> > java.lang.Exception: This is a dummy error James!
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultErrorHandler            - This exchange is not handled so its
>>> marked
>>> > as failed: Exchange[Message: Hello Willem]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>>> > 2009-08-14 14:35:00,835 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>>> is
>>> > stopping
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DirectConsumer                 - Stopping consumer:
>>> > Consumer[direct://startWithError]
>>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>>> > DefaultProducerServicePool     - Stopping service pool:
>>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
>>> > 2009-08-14 14:35:00,835 [main           ] INFO
>>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>>> > stopped
>>> >
>>> > Regards,
>>> >
>>> > Charles Moulliard
>>> > Senior Enterprise Architect
>>> > Apache Camel Committer
>>> >
>>> > *****************************
>>> > blog : http://cmoulliard.blogspot.com
>>> >
>>> >
>>> > On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <cl...@gmail.com>
>>> wrote:
>>> >
>>> >> Hi
>>> >>
>>> >> But Camel is smart and flexible so it allows you to lower the handled
>>> >> flag on doCatch (noticed handled(false)) so you can do like this, in
>>> >> which the client will get the exception back in his face. And the
>>> >> mock:error can see the caused exception from a property on the
>>> >> exchange
>>> >>
>>> >>        MockEndpoint error = getMockEndpoint("mock:error");
>>> >>        error.expectedBodiesReceived("James");
>>> >>
>>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>>> >>
>>> >>
>>> >>                from("direct:start")
>>> >>                    .split(body().tokenize("@"))
>>> >>                    .doTry()
>>> >>                         .to("bean:error")
>>> >>                        .to("mock:result")
>>> >>                     .doCatch(Exception.class).handled(false)
>>> >>                        .to("mock:error")
>>> >>                    .end();
>>> >>
>>> >>
>>> >> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com>
>>> >> wrote:
>>> >> > Hi
>>> >> >
>>> >> > Works fine I will commit an unit test later when Hadrian is done
>>> with
>>> >> > the build of Camel 2.0 release.
>>> >> >
>>> >> > 2 messages goes to mock:result
>>> >> > 1 message go to mock:error
>>> >> >
>>> >> > All as expected.
>>> >> >
>>> >> > Since you use doTry .. doCatch the client will not receive any
>>> >> > exception as he will not do that either when you do
>>> >> >
>>> >> > try {
>>> >> >
>>> >> > } catch (Exception e) {
>>> >> >  .. do something
>>> >> > }
>>> >> >
>>> >> > Since you do NOT rethrow the exception in the catch block. Catching
>>> an
>>> >> > exception is like handling it = NO MORE AN EXCEPTION
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<
>>> cmoulliard@gmail.com>
>>> >> wrote:
>>> >> >> Hi,
>>> >> >>
>>> >> >> I'm back again with try/catch and split. I have created the
>>> following
>>> >> unit
>>> >> >> test who seems to work but I don't understand why the try/catch
>>> block of
>>> >> the
>>> >> >> test does not receive the error ?
>>> >> >>
>>> >> >> Code
>>> >> >>
>>> >> >> package org.apache.camel.processor;
>>> >> >>
>>> >> >> import org.apache.camel.ContextTestSupport;
>>> >> >> // import org.apache.camel.RuntimeCamelException;
>>> >> >> import org.apache.camel.builder.RouteBuilder;
>>> >> >> import org.apache.camel.component.mock.MockEndpoint;
>>> >> >> import org.apache.camel.impl.JndiRegistry;
>>> >> >>
>>> >> >> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>>> >> >>
>>> >> >>   public void testSplitWithError() throws Exception {
>>> >> >>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
>>> >> >>        resultEndpoint.expectedBodiesReceived("James");
>>> >> >>
>>> >> >>        try {
>>> >> >>            template.sendBody("direct:startWithError", "Claus@James
>>> >> >> @Willem");
>>> >> >>            //fail("Should have thrown an exception");
>>> >> >>        } catch (Exception e) {
>>> >> >>            assertTrue(e.getCause().getMessage().startsWith("This is
>>> a
>>> >> dummy
>>> >> >> error James!"));
>>> >> >>        }
>>> >> >>
>>> >> >>        assertMockEndpointsSatisfied();
>>> >> >>    }
>>> >> >>
>>> >> >>
>>> >> >>    protected JndiRegistry createRegistry() throws Exception {
>>> >> >>        JndiRegistry jndi = super.createRegistry();
>>> >> >>        jndi.bind("error", new GenerateError());
>>> >> >>        return jndi;
>>> >> >>    }
>>> >> >>
>>> >> >>    protected RouteBuilder createRouteBuilder() {
>>> >> >>        return new RouteBuilder() {
>>> >> >>            public void configure() {
>>> >> >>                from("direct:startWithError")
>>> >> >>                    .split(body().tokenize("@"))
>>> >> >>                    .doTry()
>>> >> >>                        // GENERATE A DUMMY ERROR
>>> >> >>                        .to("bean:error")
>>> >> >>                        .to("mock:result")
>>> >> >>                       .doCatch(java.lang.Exception.class)
>>> >> >>                           .to("mock:error")
>>> >> >>                    .end();
>>> >> >>
>>> >> >>    }
>>> >> >>
>>> >> >>    public static final class GenerateError {
>>> >> >>        public GenerateError() {
>>> >> >>            // Helper Class
>>> >> >>        }
>>> >> >>
>>> >> >>        public String dummyException(String payload) throws
>>> Exception {
>>> >> >>            if (payload.equals("James")) {
>>> >> >>                throw new Exception("This is a dummy error James!");
>>> >> >>            }
>>> >> >>            return "Hello " + payload;
>>> >> >>        }
>>> >> >>
>>> >> >>    }
>>> >> >>
>>> >> >>
>>> >> >> }
>>> >> >>
>>> >> >> What I observe in the log is that the split of the body is done and
>>> each
>>> >> >> message is processed individually : one for Claus, one for Willem.
>>> For
>>> >> >> James, a dummy exception is throwed.
>>> >> >>
>>> >> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
>>> >> >> ProducerCache                  - >>>>
>>> Endpoint[direct://startWithError]
>>> >> >> Exchange[Message: Claus@James@Willem]
>>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>>> >> >> ProcessorEndpoint$1            - Starting producer:
>>> >> Producer[bean://error]
>>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>>> >> >> ProducerCache                  - Adding to producer cache with key:
>>> >> >> Endpoint[bean://error] for producer: Producer[bean://error]
>>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Claus
>>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Claus
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> MockEndpoint$1                 - Starting producer:
>>> >> Producer[mock://result]
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> ProducerCache                  - Adding to producer cache with key:
>>> >> >> Endpoint[mock://result] for producer: Producer[mock://result]
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> MockEndpoint                   - mock://result >>>> 1 :
>>> >> Exchange[Message:
>>> >> >> Hello Claus] with body: Hello Claus
>>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>>> >> >> Pipeline                       - Message exchange has failed so
>>> breaking
>>> >> out
>>> >> >> of pipeline: Exchange[Message: James] Exception:
>>> java.lang.Exception:
>>> >> This
>>> >> >> is a dummy error James!
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MockEndpoint$1                 - Starting producer:
>>> >> Producer[mock://error]
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> ProducerCache                  - Adding to producer cache with key:
>>> >> >> Endpoint[mock://error] for producer: Producer[mock://error]
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MockEndpoint                   - mock://error >>>> 1 :
>>> Exchange[Message:
>>> >> >> James] with body: James
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> TryProcessor                   - The exception is handled: true for
>>> the
>>> >> >> exception: java.lang.Exception caused by: This is a dummy error
>>> James!
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Willem
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> BeanProcessor                  - Setting bean invocation result on
>>> the
>>> >> IN
>>> >> >> message: Hello Willem
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MockEndpoint                   - mock://result >>>> 2 :
>>> >> Exchange[Message:
>>> >> >> Hello Willem] with body: Hello Willem
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> MulticastProcessor             - Done sequientel processing 3
>>> exchanges
>>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
>>> >> >> MockEndpoint                   - Asserting: Endpoint[mock://result]
>>> is
>>> >> >> satisfied
>>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
>>> >> >> MockEndpoint                   - Asserting: Endpoint[mock://error]
>>> is
>>> >> >> satisfied
>>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>>> >> >> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>>> >> >>
>>> >> >> The test succeeds but the exception is not catched in the try/catch
>>> >> block of
>>> >> >> testSplitWithError. What is wrong ?
>>> >> >>
>>> >> >> Regards,
>>> >> >>
>>> >> >> Charles
>>> >> >>
>>> >> >
>>> >> >
>>> >> >
>>> >> > --
>>> >> > Claus Ibsen
>>> >> > Apache Camel Committer
>>> >> >
>>> >> > Open Source Integration: http://fusesource.com
>>> >> > Blog: http://davsclaus.blogspot.com/
>>> >> > Twitter: http://twitter.com/davsclaus
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Claus Ibsen
>>> >> Apache Camel Committer
>>> >>
>>> >> Open Source Integration: http://fusesource.com
>>> >> Blog: http://davsclaus.blogspot.com/
>>> >> Twitter: http://twitter.com/davsclaus
>>> >>
>>> >
>>>
>>>
>>>
>>> --
>>> Claus Ibsen
>>> Apache Camel Committer
>>>
>>> Open Source Integration: http://fusesource.com
>>> Blog: http://davsclaus.blogspot.com/
>>> Twitter: http://twitter.com/davsclaus
>>>
>>
>>
>

Re: Try/catch with split

Posted by Charles Moulliard <cm...@gmail.com>.
I try to translate the syntax of Java DSL into Spring DSL.

        <route>
              <from uri="direct:startWithError"/>
                   <doTry>
                   <split>
                          <tokenize token="@"/>
                         <bean ref="error"/>
                         <to uri="mock:result"/>
                    </split>
                     <doCatch>
                        <exception>java.lang.Exception</exception>
                        <handled>
                            <constant>false</constant>
                        </handled>
                        <to
uri="log:org.apache.camel.processor?level=INFO&amp;multiline=true&amp;showException=true&amp;showCaughtException=true&amp;showStackTrace=false"/>
                        <to uri="mock:error"/>
                      </doCatch>
                  </doTry>
        </route>

The following syntax which is accepted is not the correct one because the
mock:error endpoint does not receive anything when excecuting the test case
!!

Regards,

Charles Moulliard
Senior Enterprise Architect
Apache Camel Committer

*****************************
blog : http://cmoulliard.blogspot.com


On Fri, Aug 14, 2009 at 3:12 PM, Charles Moulliard <cm...@gmail.com>wrote:

> Thx.
>
> With the following syntax, it works :
>
>    public void testSplitWithError() throws Exception {
>         MockEndpoint error = getMockEndpoint("mock:error");
>         error.expectedBodiesReceived("James");
>         error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>
>         MockEndpoint result = getMockEndpoint("mock:result");
>         result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>
>         try {
>             template.sendBody("direct:startWithError", "Claus@James
> @Willem");
>             fail("Exception has been throwed");
>         } catch (CamelExecutionException ex) {
>             // Nothing to do
>         }
>
>         assertMockEndpointsSatisfied();
>     }
>
> Regards,
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog : http://cmoulliard.blogspot.com
>
>
> On Fri, Aug 14, 2009 at 2:52 PM, Claus Ibsen <cl...@gmail.com>wrote:
>
>> You need try .. catch around the template when you send a message as
>> you do NOT handle the exception and thus the client get this exception
>> back.
>>
>>
>> On Fri, Aug 14, 2009 at 2:43 PM, Charles Moulliard<cm...@gmail.com>
>> wrote:
>> > I have adapted the test case as you propose but it fails.
>> >
>> > org.apache.camel.CamelExecutionException: Exception occured during
>> execution
>> > on the exchange: Exchange[Message: Hello Willem]
>> >    at
>> >
>> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
>> >    at
>> >
>> org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
>> >    at
>> >
>> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
>> >    at
>> >
>> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
>> >    at
>> >
>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
>> >    at
>> >
>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
>> >    at
>> >
>> org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >    at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >    at
>> >
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >    at java.lang.reflect.Method.invoke(Method.java:597)
>> >    at junit.framework.TestCase.runTest(TestCase.java:164)
>> >    at junit.framework.TestCase.runBare(TestCase.java:130)
>> >    at junit.framework.TestResult$1.protect(TestResult.java:106)
>> >    at junit.framework.TestResult.runProtected(TestResult.java:124)
>> >    at junit.framework.TestResult.run(TestResult.java:109)
>> >    at junit.framework.TestCase.run(TestCase.java:120)
>> >    at junit.framework.TestSuite.runTest(TestSuite.java:230)
>> >    at junit.framework.TestSuite.run(TestSuite.java:225)
>> >    at
>> >
>> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>> >    at
>> >
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>> >    at
>> >
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>> >    at
>> >
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>> >    at
>> >
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>> >    at
>> >
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
>> > Caused by: java.lang.Exception: This is a dummy error James!
>> >    at
>> >
>> org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
>> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >    at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >    at
>> >
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >    at java.lang.reflect.Method.invoke(Method.java:597)
>> >    at
>> > org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
>> >    at
>> >
>> org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
>> >    at
>> >
>> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
>> >    at
>> >
>> org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
>> >    at
>> >
>> org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
>> >    at
>> >
>> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
>> >    at
>> >
>> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
>> >    at
>> > org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>> >    at
>> > org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
>> >    at
>> >
>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>> >    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
>> >    at
>> org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
>> >    at
>> >
>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>> >    at
>> >
>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>> >    at
>> >
>> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>> >    at
>> >
>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>> >    at
>> >
>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>> >    at
>> >
>> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>> >    at
>> >
>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>> >    at
>> >
>> org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
>> >    at
>> >
>> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
>> >    at
>> >
>> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>> >    at
>> >
>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>> >    at
>> >
>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>> >    at
>> >
>> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>> >    at
>> >
>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>> >    at
>> >
>> org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
>> >    at
>> >
>> org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
>> >    at
>> >
>> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
>> >    at
>> >
>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
>> >    at
>> >
>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
>> >    at
>> > org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>> >    at
>> > org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
>> >    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
>> >    at
>> >
>> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
>> >    at
>> >
>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
>> >    ... 20 more
>> >
>> >
>> >
>> > CODE ********************************************************
>> >
>> > import org.apache.camel.ContextTestSupport;
>> > import org.apache.camel.Exchange;
>> > import org.apache.camel.builder.RouteBuilder;
>> > import org.apache.camel.component.mock.MockEndpoint;
>> > import org.apache.camel.impl.JndiRegistry;
>> >
>> > /**
>> >  * @version $Revision: 736555 $
>> >  */
>> > public class SplitterTryCatchErrorTest extends ContextTestSupport {
>> >
>> >   public void testSplitWithError() throws Exception {
>> >        MockEndpoint error = getMockEndpoint("mock:error");
>> >        error.expectedBodiesReceived("James");
>> >
>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
>> > is a dummy error James!");
>> >
>> >        MockEndpoint result = getMockEndpoint("mock:result");
>> >        result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>> >
>> >        template.sendBody("direct:startWithError", "Claus@James
>> @Willem");
>> >
>> >        assertMockEndpointsSatisfied();
>> >    }
>> >
>> >    protected JndiRegistry createRegistry() throws Exception {
>> >        JndiRegistry jndi = super.createRegistry();
>> >        jndi.bind("error", new GenerateError());
>> >        return jndi;
>> >    }
>> >
>> >    protected RouteBuilder createRouteBuilder() {
>> >        return new RouteBuilder() {
>> >            public void configure() {
>> >                from("direct:startWithError")
>> >                    .split(body().tokenize("@"))
>> >                    .doTry()
>> >                        // GENERATE A DUMMY ERROR
>> >                        .to("bean:error")
>> >                        .to("mock:result")
>> >                       .doCatch(java.lang.Exception.class).handled(false)
>> >
>> >
>> .to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
>> >                           .to("mock:error")
>> >                    .end();
>> >            }
>> >        };
>> >    }
>> >
>> >    public static final class GenerateError {
>> >        public GenerateError() {
>> >            // Helper Class
>> >        }
>> >
>> >        public String dummyException(String payload) throws Exception {
>> >            if (payload.equals("James")) {
>> >                throw new Exception("This is a dummy error James!");
>> >            }
>> >            return "Hello " + payload;
>> >        }
>> >
>> >    }
>> >
>> >
>> > }
>> >
>> > ********************************************
>> >
>> > Here is the trace of the log
>> >
>> > 2009-08-14 14:34:57,726 [main           ] INFO
>> > DefaultCamelContext            - JMX enabled. Using
>> > InstrumentationLifecycleStrategy.
>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
>> > SplitterTryCatchErrorTest      - Using created route builder: Routes: []
>> > 2009-08-14 14:34:57,882 [main           ] DEBUG
>> > DefaultCamelContext            - Adding routes from builder: Routes: []
>> > 2009-08-14 14:34:58,132 [main           ] INFO
>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
>> > starting
>> > 2009-08-14 14:34:58,132 [main           ] DEBUG
>> > DefaultProducerServicePool     - Starting service pool:
>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
>> > DefaultComponentResolver       - Found component: direct via type:
>> > org.apache.camel.component.direct.DirectComponent via:
>> > META-INF/services/org/apache/camel/component/direct
>> > 2009-08-14 14:34:58,601 [main           ] DEBUG
>> > DefaultComponent               - Creating endpoint
>> > uri=[direct://startWithError], path=[startWithError], parameters=[{}]
>> > 2009-08-14 14:34:58,616 [main           ] DEBUG
>> > DefaultCamelContext            - direct://startWithError converted to
>> > endpoint: Endpoint[direct://startWithError] by component:
>> > org.apache.camel.component.direct.DirectComponent@1e0f2f6
>> > 2009-08-14 14:34:58,695 [main           ] DEBUG
>> > DefaultComponentResolver       - Found component: bean via type:
>> > org.apache.camel.component.bean.BeanComponent via:
>> > META-INF/services/org/apache/camel/component/bean
>> > 2009-08-14 14:34:58,710 [main           ] DEBUG
>> > DefaultComponent               - Creating endpoint uri=[bean://error],
>> > path=[error], parameters=[{}]
>> > 2009-08-14 14:34:58,726 [main           ] DEBUG
>> > DefaultCamelContext            - bean://error converted to endpoint:
>> > Endpoint[bean://error] by component:
>> > org.apache.camel.component.bean.BeanComponent@1c0f2e5
>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
>> > DefaultComponentResolver       - Found component: mock via type:
>> > org.apache.camel.component.mock.MockComponent via:
>> > META-INF/services/org/apache/camel/component/mock
>> > 2009-08-14 14:34:58,773 [main           ] DEBUG
>> > DefaultComponent               - Creating endpoint uri=[mock://result],
>> > path=[result], parameters=[{}]
>> > 2009-08-14 14:34:58,788 [main           ] DEBUG
>> > DefaultCamelContext            - mock://result converted to endpoint:
>> > Endpoint[mock://result] by component:
>> > org.apache.camel.component.mock.MockComponent@1977b9b
>> > 2009-08-14 14:34:58,835 [main           ] DEBUG
>> > DefaultComponentResolver       - Found component: log via type:
>> > org.apache.camel.component.log.LogComponent via:
>> > META-INF/services/org/apache/camel/component/log
>> > 2009-08-14 14:34:58,851 [main           ] DEBUG
>> > DefaultComponent               - Creating endpoint
>> >
>> uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
>> > path=[org.apache.camel.processor], parameters=[{level=INFO,
>> multiline=true,
>> > showCaughtException=true, showException=true, showStackTrace=false}]
>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>> > DefaultCamelContext            -
>> >
>> log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
>> > converted to endpoint:
>> >
>> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>> > by component: org.apache.camel.component.log.LogComponent@1a7ddcf
>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>> > DefaultComponent               - Creating endpoint uri=[mock://error],
>> > path=[error], parameters=[{}]
>> > 2009-08-14 14:34:58,882 [main           ] DEBUG
>> > DefaultCamelContext            - mock://error converted to endpoint:
>> > Endpoint[mock://error] by component:
>> > org.apache.camel.component.mock.MockComponent@1977b9b
>> > 2009-08-14 14:34:58,976 [main           ] DEBUG
>> > DefaultCamelContext            - Starting routes
>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>> > DirectConsumer                 - Starting consumer:
>> > Consumer[direct://startWithError]
>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>> > DefaultCamelContext            - Route 0:
>> > EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
>> > UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
>> > {Pipeline[Channel[sendTo(Endpoint[bean://error])],
>> > Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
>> > java.lang.Exception] ->
>> >
>> Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
>> > Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
>> > useLatestAggregationStrategy]])]
>> > 2009-08-14 14:34:59,116 [main           ] DEBUG
>> > DefaultCamelContext            - Started routes
>> > 2009-08-14 14:34:59,116 [main           ] INFO
>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>> > started
>> > 2009-08-14 14:34:59,163 [main           ] DEBUG
>> > DirectProducer                 - Starting producer:
>> > Producer[direct://startWithError]
>> > 2009-08-14 14:34:59,179 [main           ] DEBUG
>> > ProducerCache                  - Adding to producer cache with key:
>> > Endpoint[direct://startWithError] for producer:
>> > Producer[direct://startWithError]
>> > 2009-08-14 14:34:59,304 [main           ] DEBUG
>> > ProducerCache                  - >>>> Endpoint[direct://startWithError]
>> > Exchange[Message: Claus@James@Willem]
>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
>> > ProcessorEndpoint$1            - Starting producer:
>> Producer[bean://error]
>> > 2009-08-14 14:34:59,413 [main           ] DEBUG
>> > ProducerCache                  - Adding to producer cache with key:
>> > Endpoint[bean://error] for producer: Producer[bean://error]
>> > 2009-08-14 14:35:00,726 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.component.file.GenericFileConverter
>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.StaticMethodWithExchangeTestConverter
>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.CamelConverter
>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.CollectionConverter
>> > 2009-08-14 14:35:00,757 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.IOConverter
>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.jaxp.DomConverter
>> > 2009-08-14 14:35:00,773 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.jaxp.StaxConverter
>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.jaxp.StreamSourceConverter
>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.jaxp.XmlConverter
>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.NIOConverter
>> > 2009-08-14 14:35:00,788 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.ObjectConverter
>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>> > AnnotationTypeConverterLoader  - Loading converter class:
>> > org.apache.camel.converter.stream.StreamCacheConverter
>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>> > BeanProcessor                  - Setting bean invocation result on the
>> IN
>> > message: Hello Claus
>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>> > BeanProcessor                  - Setting bean invocation result on the
>> IN
>> > message: Hello Claus
>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>> > MockEndpoint$1                 - Starting producer:
>> Producer[mock://result]
>> > 2009-08-14 14:35:00,804 [main           ] DEBUG
>> > ProducerCache                  - Adding to producer cache with key:
>> > Endpoint[mock://result] for producer: Producer[mock://result]
>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>> > MockEndpoint                   - mock://result >>>> 1 :
>> Exchange[Message:
>> > Hello Claus] with body: Hello Claus
>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>> > Pipeline                       - Message exchange has failed so breaking
>> out
>> > of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
>> This
>> > is a dummy error James!
>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>> > ProcessorEndpoint$1            - Starting producer:
>> >
>> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>> > 2009-08-14 14:35:00,820 [main           ] DEBUG
>> > ProducerCache                  - Adding to producer cache with key:
>> >
>> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>> > for producer:
>> >
>> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
>> > 2009-08-14 14:35:00,835 [main           ] INFO
>> > processor                      - Exchange[
>> > , BodyType:String
>> > , Body:James
>> > , CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This
>> is a
>> > dummy error James!]
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > MockEndpoint$1                 - Starting producer:
>> Producer[mock://error]
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > ProducerCache                  - Adding to producer cache with key:
>> > Endpoint[mock://error] for producer: Producer[mock://error]
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
>> > James] with body: James
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > TryProcessor                   - The exception is handled: false for the
>> > exception: java.lang.Exception caused by: This is a dummy error James!
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > DefaultErrorHandler            - Failed delivery for exchangeId:
>> > ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0 caught:
>> > java.lang.Exception: This is a dummy error James!
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > DefaultErrorHandler            - This exchange is not handled so its
>> marked
>> > as failed: Exchange[Message: James]
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > BeanProcessor                  - Setting bean invocation result on the
>> IN
>> > message: Hello Willem
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > BeanProcessor                  - Setting bean invocation result on the
>> IN
>> > message: Hello Willem
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > MockEndpoint                   - mock://result >>>> 2 :
>> Exchange[Message:
>> > Hello Willem] with body: Hello Willem
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > MulticastProcessor             - Done sequientel processing 3 exchanges
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > DefaultErrorHandler            - Failed delivery for exchangeId:
>> > ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0 caught:
>> > java.lang.Exception: This is a dummy error James!
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > DefaultErrorHandler            - This exchange is not handled so its
>> marked
>> > as failed: Exchange[Message: Hello Willem]
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>> > 2009-08-14 14:35:00,835 [main           ] INFO
>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
>> > stopping
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > DirectConsumer                 - Stopping consumer:
>> > Consumer[direct://startWithError]
>> > 2009-08-14 14:35:00,835 [main           ] DEBUG
>> > DefaultProducerServicePool     - Stopping service pool:
>> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
>> > 2009-08-14 14:35:00,835 [main           ] INFO
>> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
>> > stopped
>> >
>> > Regards,
>> >
>> > Charles Moulliard
>> > Senior Enterprise Architect
>> > Apache Camel Committer
>> >
>> > *****************************
>> > blog : http://cmoulliard.blogspot.com
>> >
>> >
>> > On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <cl...@gmail.com>
>> wrote:
>> >
>> >> Hi
>> >>
>> >> But Camel is smart and flexible so it allows you to lower the handled
>> >> flag on doCatch (noticed handled(false)) so you can do like this, in
>> >> which the client will get the exception back in his face. And the
>> >> mock:error can see the caused exception from a property on the
>> >> exchange
>> >>
>> >>        MockEndpoint error = getMockEndpoint("mock:error");
>> >>        error.expectedBodiesReceived("James");
>> >>
>>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>> >>
>> >>
>> >>                from("direct:start")
>> >>                    .split(body().tokenize("@"))
>> >>                    .doTry()
>> >>                         .to("bean:error")
>> >>                        .to("mock:result")
>> >>                     .doCatch(Exception.class).handled(false)
>> >>                        .to("mock:error")
>> >>                    .end();
>> >>
>> >>
>> >> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com>
>> >> wrote:
>> >> > Hi
>> >> >
>> >> > Works fine I will commit an unit test later when Hadrian is done with
>> >> > the build of Camel 2.0 release.
>> >> >
>> >> > 2 messages goes to mock:result
>> >> > 1 message go to mock:error
>> >> >
>> >> > All as expected.
>> >> >
>> >> > Since you use doTry .. doCatch the client will not receive any
>> >> > exception as he will not do that either when you do
>> >> >
>> >> > try {
>> >> >
>> >> > } catch (Exception e) {
>> >> >  .. do something
>> >> > }
>> >> >
>> >> > Since you do NOT rethrow the exception in the catch block. Catching
>> an
>> >> > exception is like handling it = NO MORE AN EXCEPTION
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<
>> cmoulliard@gmail.com>
>> >> wrote:
>> >> >> Hi,
>> >> >>
>> >> >> I'm back again with try/catch and split. I have created the
>> following
>> >> unit
>> >> >> test who seems to work but I don't understand why the try/catch
>> block of
>> >> the
>> >> >> test does not receive the error ?
>> >> >>
>> >> >> Code
>> >> >>
>> >> >> package org.apache.camel.processor;
>> >> >>
>> >> >> import org.apache.camel.ContextTestSupport;
>> >> >> // import org.apache.camel.RuntimeCamelException;
>> >> >> import org.apache.camel.builder.RouteBuilder;
>> >> >> import org.apache.camel.component.mock.MockEndpoint;
>> >> >> import org.apache.camel.impl.JndiRegistry;
>> >> >>
>> >> >> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>> >> >>
>> >> >>   public void testSplitWithError() throws Exception {
>> >> >>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
>> >> >>        resultEndpoint.expectedBodiesReceived("James");
>> >> >>
>> >> >>        try {
>> >> >>            template.sendBody("direct:startWithError", "Claus@James
>> >> >> @Willem");
>> >> >>            //fail("Should have thrown an exception");
>> >> >>        } catch (Exception e) {
>> >> >>            assertTrue(e.getCause().getMessage().startsWith("This is
>> a
>> >> dummy
>> >> >> error James!"));
>> >> >>        }
>> >> >>
>> >> >>        assertMockEndpointsSatisfied();
>> >> >>    }
>> >> >>
>> >> >>
>> >> >>    protected JndiRegistry createRegistry() throws Exception {
>> >> >>        JndiRegistry jndi = super.createRegistry();
>> >> >>        jndi.bind("error", new GenerateError());
>> >> >>        return jndi;
>> >> >>    }
>> >> >>
>> >> >>    protected RouteBuilder createRouteBuilder() {
>> >> >>        return new RouteBuilder() {
>> >> >>            public void configure() {
>> >> >>                from("direct:startWithError")
>> >> >>                    .split(body().tokenize("@"))
>> >> >>                    .doTry()
>> >> >>                        // GENERATE A DUMMY ERROR
>> >> >>                        .to("bean:error")
>> >> >>                        .to("mock:result")
>> >> >>                       .doCatch(java.lang.Exception.class)
>> >> >>                           .to("mock:error")
>> >> >>                    .end();
>> >> >>
>> >> >>    }
>> >> >>
>> >> >>    public static final class GenerateError {
>> >> >>        public GenerateError() {
>> >> >>            // Helper Class
>> >> >>        }
>> >> >>
>> >> >>        public String dummyException(String payload) throws Exception
>> {
>> >> >>            if (payload.equals("James")) {
>> >> >>                throw new Exception("This is a dummy error James!");
>> >> >>            }
>> >> >>            return "Hello " + payload;
>> >> >>        }
>> >> >>
>> >> >>    }
>> >> >>
>> >> >>
>> >> >> }
>> >> >>
>> >> >> What I observe in the log is that the split of the body is done and
>> each
>> >> >> message is processed individually : one for Claus, one for Willem.
>> For
>> >> >> James, a dummy exception is throwed.
>> >> >>
>> >> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
>> >> >> ProducerCache                  - >>>>
>> Endpoint[direct://startWithError]
>> >> >> Exchange[Message: Claus@James@Willem]
>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>> >> >> ProcessorEndpoint$1            - Starting producer:
>> >> Producer[bean://error]
>> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>> >> >> ProducerCache                  - Adding to producer cache with key:
>> >> >> Endpoint[bean://error] for producer: Producer[bean://error]
>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>> >> >> BeanProcessor                  - Setting bean invocation result on
>> the
>> >> IN
>> >> >> message: Hello Claus
>> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>> >> >> BeanProcessor                  - Setting bean invocation result on
>> the
>> >> IN
>> >> >> message: Hello Claus
>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> >> MockEndpoint$1                 - Starting producer:
>> >> Producer[mock://result]
>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> >> ProducerCache                  - Adding to producer cache with key:
>> >> >> Endpoint[mock://result] for producer: Producer[mock://result]
>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> >> MockEndpoint                   - mock://result >>>> 1 :
>> >> Exchange[Message:
>> >> >> Hello Claus] with body: Hello Claus
>> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> >> Pipeline                       - Message exchange has failed so
>> breaking
>> >> out
>> >> >> of pipeline: Exchange[Message: James] Exception:
>> java.lang.Exception:
>> >> This
>> >> >> is a dummy error James!
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> MockEndpoint$1                 - Starting producer:
>> >> Producer[mock://error]
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> ProducerCache                  - Adding to producer cache with key:
>> >> >> Endpoint[mock://error] for producer: Producer[mock://error]
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> MockEndpoint                   - mock://error >>>> 1 :
>> Exchange[Message:
>> >> >> James] with body: James
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> TryProcessor                   - The exception is handled: true for
>> the
>> >> >> exception: java.lang.Exception caused by: This is a dummy error
>> James!
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> BeanProcessor                  - Setting bean invocation result on
>> the
>> >> IN
>> >> >> message: Hello Willem
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> BeanProcessor                  - Setting bean invocation result on
>> the
>> >> IN
>> >> >> message: Hello Willem
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> MockEndpoint                   - mock://result >>>> 2 :
>> >> Exchange[Message:
>> >> >> Hello Willem] with body: Hello Willem
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> MulticastProcessor             - Done sequientel processing 3
>> exchanges
>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
>> >> >> MockEndpoint                   - Asserting: Endpoint[mock://result]
>> is
>> >> >> satisfied
>> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
>> >> >> MockEndpoint                   - Asserting: Endpoint[mock://error]
>> is
>> >> >> satisfied
>> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> >> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>> >> >>
>> >> >> The test succeeds but the exception is not catched in the try/catch
>> >> block of
>> >> >> testSplitWithError. What is wrong ?
>> >> >>
>> >> >> Regards,
>> >> >>
>> >> >> Charles
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Claus Ibsen
>> >> > Apache Camel Committer
>> >> >
>> >> > Open Source Integration: http://fusesource.com
>> >> > Blog: http://davsclaus.blogspot.com/
>> >> > Twitter: http://twitter.com/davsclaus
>> >> >
>> >>
>> >>
>> >>
>> >> --
>> >> Claus Ibsen
>> >> Apache Camel Committer
>> >>
>> >> Open Source Integration: http://fusesource.com
>> >> Blog: http://davsclaus.blogspot.com/
>> >> Twitter: http://twitter.com/davsclaus
>> >>
>> >
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Open Source Integration: http://fusesource.com
>> Blog: http://davsclaus.blogspot.com/
>> Twitter: http://twitter.com/davsclaus
>>
>
>

Re: Try/catch with split

Posted by Charles Moulliard <cm...@gmail.com>.
Thx.

With the following syntax, it works :

   public void testSplitWithError() throws Exception {
        MockEndpoint error = getMockEndpoint("mock:error");
        error.expectedBodiesReceived("James");
        error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();

        MockEndpoint result = getMockEndpoint("mock:result");
        result.expectedBodiesReceived("Hello Claus", "Hello Willem");

        try {
            template.sendBody("direct:startWithError", "Claus@James
@Willem");
            fail("Exception has been throwed");
        } catch (CamelExecutionException ex) {
            // Nothing to do
        }

        assertMockEndpointsSatisfied();
    }

Regards,

Charles Moulliard
Senior Enterprise Architect
Apache Camel Committer

*****************************
blog : http://cmoulliard.blogspot.com


On Fri, Aug 14, 2009 at 2:52 PM, Claus Ibsen <cl...@gmail.com> wrote:

> You need try .. catch around the template when you send a message as
> you do NOT handle the exception and thus the client get this exception
> back.
>
>
> On Fri, Aug 14, 2009 at 2:43 PM, Charles Moulliard<cm...@gmail.com>
> wrote:
> > I have adapted the test case as you propose but it fails.
> >
> > org.apache.camel.CamelExecutionException: Exception occured during
> execution
> > on the exchange: Exchange[Message: Hello Willem]
> >    at
> >
> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
> >    at
> >
> org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
> >    at
> >
> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
> >    at
> >
> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
> >    at
> >
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
> >    at
> >
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
> >    at
> >
> org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >    at
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >    at
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >    at java.lang.reflect.Method.invoke(Method.java:597)
> >    at junit.framework.TestCase.runTest(TestCase.java:164)
> >    at junit.framework.TestCase.runBare(TestCase.java:130)
> >    at junit.framework.TestResult$1.protect(TestResult.java:106)
> >    at junit.framework.TestResult.runProtected(TestResult.java:124)
> >    at junit.framework.TestResult.run(TestResult.java:109)
> >    at junit.framework.TestCase.run(TestCase.java:120)
> >    at junit.framework.TestSuite.runTest(TestSuite.java:230)
> >    at junit.framework.TestSuite.run(TestSuite.java:225)
> >    at
> >
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
> >    at
> >
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> >    at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
> >    at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
> >    at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
> >    at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> > Caused by: java.lang.Exception: This is a dummy error James!
> >    at
> >
> org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
> >    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >    at
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >    at
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >    at java.lang.reflect.Method.invoke(Method.java:597)
> >    at
> > org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
> >    at
> > org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
> >    at
> >
> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
> >    at
> >
> org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
> >    at
> >
> org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
> >    at
> >
> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
> >    at
> >
> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
> >    at
> > org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
> >    at
> > org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
> >    at
> >
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
> >    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
> >    at
> org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
> >    at
> >
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
> >    at
> >
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
> >    at
> >
> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
> >    at
> >
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
> >    at
> >
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
> >    at
> >
> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
> >    at
> >
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
> >    at
> >
> org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
> >    at
> >
> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
> >    at
> >
> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
> >    at
> >
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
> >    at
> >
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
> >    at
> >
> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
> >    at
> >
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
> >    at
> >
> org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
> >    at
> >
> org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
> >    at
> >
> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
> >    at
> >
> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
> >    at
> >
> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
> >    at
> > org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
> >    at
> > org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
> >    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
> >    at
> >
> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
> >    at
> >
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
> >    ... 20 more
> >
> >
> >
> > CODE ********************************************************
> >
> > import org.apache.camel.ContextTestSupport;
> > import org.apache.camel.Exchange;
> > import org.apache.camel.builder.RouteBuilder;
> > import org.apache.camel.component.mock.MockEndpoint;
> > import org.apache.camel.impl.JndiRegistry;
> >
> > /**
> >  * @version $Revision: 736555 $
> >  */
> > public class SplitterTryCatchErrorTest extends ContextTestSupport {
> >
> >   public void testSplitWithError() throws Exception {
> >        MockEndpoint error = getMockEndpoint("mock:error");
> >        error.expectedBodiesReceived("James");
> >
>  error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
> > is a dummy error James!");
> >
> >        MockEndpoint result = getMockEndpoint("mock:result");
> >        result.expectedBodiesReceived("Hello Claus", "Hello Willem");
> >
> >        template.sendBody("direct:startWithError", "Claus@James@Willem");
> >
> >        assertMockEndpointsSatisfied();
> >    }
> >
> >    protected JndiRegistry createRegistry() throws Exception {
> >        JndiRegistry jndi = super.createRegistry();
> >        jndi.bind("error", new GenerateError());
> >        return jndi;
> >    }
> >
> >    protected RouteBuilder createRouteBuilder() {
> >        return new RouteBuilder() {
> >            public void configure() {
> >                from("direct:startWithError")
> >                    .split(body().tokenize("@"))
> >                    .doTry()
> >                        // GENERATE A DUMMY ERROR
> >                        .to("bean:error")
> >                        .to("mock:result")
> >                       .doCatch(java.lang.Exception.class).handled(false)
> >
> >
> .to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
> >                           .to("mock:error")
> >                    .end();
> >            }
> >        };
> >    }
> >
> >    public static final class GenerateError {
> >        public GenerateError() {
> >            // Helper Class
> >        }
> >
> >        public String dummyException(String payload) throws Exception {
> >            if (payload.equals("James")) {
> >                throw new Exception("This is a dummy error James!");
> >            }
> >            return "Hello " + payload;
> >        }
> >
> >    }
> >
> >
> > }
> >
> > ********************************************
> >
> > Here is the trace of the log
> >
> > 2009-08-14 14:34:57,726 [main           ] INFO
> > DefaultCamelContext            - JMX enabled. Using
> > InstrumentationLifecycleStrategy.
> > 2009-08-14 14:34:57,882 [main           ] DEBUG
> > SplitterTryCatchErrorTest      - Using created route builder: Routes: []
> > 2009-08-14 14:34:57,882 [main           ] DEBUG
> > DefaultCamelContext            - Adding routes from builder: Routes: []
> > 2009-08-14 14:34:58,132 [main           ] INFO
> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
> > starting
> > 2009-08-14 14:34:58,132 [main           ] DEBUG
> > DefaultProducerServicePool     - Starting service pool:
> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
> > 2009-08-14 14:34:58,601 [main           ] DEBUG
> > DefaultComponentResolver       - Found component: direct via type:
> > org.apache.camel.component.direct.DirectComponent via:
> > META-INF/services/org/apache/camel/component/direct
> > 2009-08-14 14:34:58,601 [main           ] DEBUG
> > DefaultComponent               - Creating endpoint
> > uri=[direct://startWithError], path=[startWithError], parameters=[{}]
> > 2009-08-14 14:34:58,616 [main           ] DEBUG
> > DefaultCamelContext            - direct://startWithError converted to
> > endpoint: Endpoint[direct://startWithError] by component:
> > org.apache.camel.component.direct.DirectComponent@1e0f2f6
> > 2009-08-14 14:34:58,695 [main           ] DEBUG
> > DefaultComponentResolver       - Found component: bean via type:
> > org.apache.camel.component.bean.BeanComponent via:
> > META-INF/services/org/apache/camel/component/bean
> > 2009-08-14 14:34:58,710 [main           ] DEBUG
> > DefaultComponent               - Creating endpoint uri=[bean://error],
> > path=[error], parameters=[{}]
> > 2009-08-14 14:34:58,726 [main           ] DEBUG
> > DefaultCamelContext            - bean://error converted to endpoint:
> > Endpoint[bean://error] by component:
> > org.apache.camel.component.bean.BeanComponent@1c0f2e5
> > 2009-08-14 14:34:58,773 [main           ] DEBUG
> > DefaultComponentResolver       - Found component: mock via type:
> > org.apache.camel.component.mock.MockComponent via:
> > META-INF/services/org/apache/camel/component/mock
> > 2009-08-14 14:34:58,773 [main           ] DEBUG
> > DefaultComponent               - Creating endpoint uri=[mock://result],
> > path=[result], parameters=[{}]
> > 2009-08-14 14:34:58,788 [main           ] DEBUG
> > DefaultCamelContext            - mock://result converted to endpoint:
> > Endpoint[mock://result] by component:
> > org.apache.camel.component.mock.MockComponent@1977b9b
> > 2009-08-14 14:34:58,835 [main           ] DEBUG
> > DefaultComponentResolver       - Found component: log via type:
> > org.apache.camel.component.log.LogComponent via:
> > META-INF/services/org/apache/camel/component/log
> > 2009-08-14 14:34:58,851 [main           ] DEBUG
> > DefaultComponent               - Creating endpoint
> >
> uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
> > path=[org.apache.camel.processor], parameters=[{level=INFO,
> multiline=true,
> > showCaughtException=true, showException=true, showStackTrace=false}]
> > 2009-08-14 14:34:58,882 [main           ] DEBUG
> > DefaultCamelContext            -
> >
> log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
> > converted to endpoint:
> >
> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> > by component: org.apache.camel.component.log.LogComponent@1a7ddcf
> > 2009-08-14 14:34:58,882 [main           ] DEBUG
> > DefaultComponent               - Creating endpoint uri=[mock://error],
> > path=[error], parameters=[{}]
> > 2009-08-14 14:34:58,882 [main           ] DEBUG
> > DefaultCamelContext            - mock://error converted to endpoint:
> > Endpoint[mock://error] by component:
> > org.apache.camel.component.mock.MockComponent@1977b9b
> > 2009-08-14 14:34:58,976 [main           ] DEBUG
> > DefaultCamelContext            - Starting routes
> > 2009-08-14 14:34:59,116 [main           ] DEBUG
> > DirectConsumer                 - Starting consumer:
> > Consumer[direct://startWithError]
> > 2009-08-14 14:34:59,116 [main           ] DEBUG
> > DefaultCamelContext            - Route 0:
> > EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
> > UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
> > {Pipeline[Channel[sendTo(Endpoint[bean://error])],
> > Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
> > java.lang.Exception] ->
> >
> Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
> > Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
> > useLatestAggregationStrategy]])]
> > 2009-08-14 14:34:59,116 [main           ] DEBUG
> > DefaultCamelContext            - Started routes
> > 2009-08-14 14:34:59,116 [main           ] INFO
> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> > started
> > 2009-08-14 14:34:59,163 [main           ] DEBUG
> > DirectProducer                 - Starting producer:
> > Producer[direct://startWithError]
> > 2009-08-14 14:34:59,179 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[direct://startWithError] for producer:
> > Producer[direct://startWithError]
> > 2009-08-14 14:34:59,304 [main           ] DEBUG
> > ProducerCache                  - >>>> Endpoint[direct://startWithError]
> > Exchange[Message: Claus@James@Willem]
> > 2009-08-14 14:34:59,413 [main           ] DEBUG
> > ProcessorEndpoint$1            - Starting producer:
> Producer[bean://error]
> > 2009-08-14 14:34:59,413 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[bean://error] for producer: Producer[bean://error]
> > 2009-08-14 14:35:00,726 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.component.file.GenericFileConverter
> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.StaticMethodWithExchangeTestConverter
> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.CamelConverter
> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.CollectionConverter
> > 2009-08-14 14:35:00,757 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.IOConverter
> > 2009-08-14 14:35:00,773 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.jaxp.DomConverter
> > 2009-08-14 14:35:00,773 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.jaxp.StaxConverter
> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.jaxp.StreamSourceConverter
> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.jaxp.XmlConverter
> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.NIOConverter
> > 2009-08-14 14:35:00,788 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.ObjectConverter
> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> > AnnotationTypeConverterLoader  - Loading converter class:
> > org.apache.camel.converter.stream.StreamCacheConverter
> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Claus
> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Claus
> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> > MockEndpoint$1                 - Starting producer:
> Producer[mock://result]
> > 2009-08-14 14:35:00,804 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[mock://result] for producer: Producer[mock://result]
> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> > MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
> > Hello Claus] with body: Hello Claus
> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> > Pipeline                       - Message exchange has failed so breaking
> out
> > of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
> This
> > is a dummy error James!
> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> > ProcessorEndpoint$1            - Starting producer:
> >
> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> > 2009-08-14 14:35:00,820 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> >
> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> > for producer:
> >
> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> > 2009-08-14 14:35:00,835 [main           ] INFO
> > processor                      - Exchange[
> > , BodyType:String
> > , Body:James
> > , CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This is
> a
> > dummy error James!]
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > MockEndpoint$1                 - Starting producer:
> Producer[mock://error]
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[mock://error] for producer: Producer[mock://error]
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
> > James] with body: James
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > TryProcessor                   - The exception is handled: false for the
> > exception: java.lang.Exception caused by: This is a dummy error James!
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > DefaultErrorHandler            - Failed delivery for exchangeId:
> > ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0 caught:
> > java.lang.Exception: This is a dummy error James!
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > DefaultErrorHandler            - This exchange is not handled so its
> marked
> > as failed: Exchange[Message: James]
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Willem
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Willem
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
> > Hello Willem] with body: Hello Willem
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > MulticastProcessor             - Done sequientel processing 3 exchanges
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > DefaultErrorHandler            - Failed delivery for exchangeId:
> > ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0 caught:
> > java.lang.Exception: This is a dummy error James!
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > DefaultErrorHandler            - This exchange is not handled so its
> marked
> > as failed: Exchange[Message: Hello Willem]
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
> > 2009-08-14 14:35:00,835 [main           ] INFO
> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
> > stopping
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > DirectConsumer                 - Stopping consumer:
> > Consumer[direct://startWithError]
> > 2009-08-14 14:35:00,835 [main           ] DEBUG
> > DefaultProducerServicePool     - Stopping service pool:
> > org.apache.camel.impl.DefaultProducerServicePool@b02efa
> > 2009-08-14 14:35:00,835 [main           ] INFO
> > DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> > stopped
> >
> > Regards,
> >
> > Charles Moulliard
> > Senior Enterprise Architect
> > Apache Camel Committer
> >
> > *****************************
> > blog : http://cmoulliard.blogspot.com
> >
> >
> > On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <cl...@gmail.com>
> wrote:
> >
> >> Hi
> >>
> >> But Camel is smart and flexible so it allows you to lower the handled
> >> flag on doCatch (noticed handled(false)) so you can do like this, in
> >> which the client will get the exception back in his face. And the
> >> mock:error can see the caused exception from a property on the
> >> exchange
> >>
> >>        MockEndpoint error = getMockEndpoint("mock:error");
> >>        error.expectedBodiesReceived("James");
> >>        error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
> >>
> >>
> >>                from("direct:start")
> >>                    .split(body().tokenize("@"))
> >>                    .doTry()
> >>                         .to("bean:error")
> >>                        .to("mock:result")
> >>                     .doCatch(Exception.class).handled(false)
> >>                        .to("mock:error")
> >>                    .end();
> >>
> >>
> >> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com>
> >> wrote:
> >> > Hi
> >> >
> >> > Works fine I will commit an unit test later when Hadrian is done with
> >> > the build of Camel 2.0 release.
> >> >
> >> > 2 messages goes to mock:result
> >> > 1 message go to mock:error
> >> >
> >> > All as expected.
> >> >
> >> > Since you use doTry .. doCatch the client will not receive any
> >> > exception as he will not do that either when you do
> >> >
> >> > try {
> >> >
> >> > } catch (Exception e) {
> >> >  .. do something
> >> > }
> >> >
> >> > Since you do NOT rethrow the exception in the catch block. Catching an
> >> > exception is like handling it = NO MORE AN EXCEPTION
> >> >
> >> >
> >> >
> >> >
> >> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<
> cmoulliard@gmail.com>
> >> wrote:
> >> >> Hi,
> >> >>
> >> >> I'm back again with try/catch and split. I have created the following
> >> unit
> >> >> test who seems to work but I don't understand why the try/catch block
> of
> >> the
> >> >> test does not receive the error ?
> >> >>
> >> >> Code
> >> >>
> >> >> package org.apache.camel.processor;
> >> >>
> >> >> import org.apache.camel.ContextTestSupport;
> >> >> // import org.apache.camel.RuntimeCamelException;
> >> >> import org.apache.camel.builder.RouteBuilder;
> >> >> import org.apache.camel.component.mock.MockEndpoint;
> >> >> import org.apache.camel.impl.JndiRegistry;
> >> >>
> >> >> public class SplitterTryCatchErrorTest extends ContextTestSupport {
> >> >>
> >> >>   public void testSplitWithError() throws Exception {
> >> >>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
> >> >>        resultEndpoint.expectedBodiesReceived("James");
> >> >>
> >> >>        try {
> >> >>            template.sendBody("direct:startWithError", "Claus@James
> >> >> @Willem");
> >> >>            //fail("Should have thrown an exception");
> >> >>        } catch (Exception e) {
> >> >>            assertTrue(e.getCause().getMessage().startsWith("This is a
> >> dummy
> >> >> error James!"));
> >> >>        }
> >> >>
> >> >>        assertMockEndpointsSatisfied();
> >> >>    }
> >> >>
> >> >>
> >> >>    protected JndiRegistry createRegistry() throws Exception {
> >> >>        JndiRegistry jndi = super.createRegistry();
> >> >>        jndi.bind("error", new GenerateError());
> >> >>        return jndi;
> >> >>    }
> >> >>
> >> >>    protected RouteBuilder createRouteBuilder() {
> >> >>        return new RouteBuilder() {
> >> >>            public void configure() {
> >> >>                from("direct:startWithError")
> >> >>                    .split(body().tokenize("@"))
> >> >>                    .doTry()
> >> >>                        // GENERATE A DUMMY ERROR
> >> >>                        .to("bean:error")
> >> >>                        .to("mock:result")
> >> >>                       .doCatch(java.lang.Exception.class)
> >> >>                           .to("mock:error")
> >> >>                    .end();
> >> >>
> >> >>    }
> >> >>
> >> >>    public static final class GenerateError {
> >> >>        public GenerateError() {
> >> >>            // Helper Class
> >> >>        }
> >> >>
> >> >>        public String dummyException(String payload) throws Exception
> {
> >> >>            if (payload.equals("James")) {
> >> >>                throw new Exception("This is a dummy error James!");
> >> >>            }
> >> >>            return "Hello " + payload;
> >> >>        }
> >> >>
> >> >>    }
> >> >>
> >> >>
> >> >> }
> >> >>
> >> >> What I observe in the log is that the split of the body is done and
> each
> >> >> message is processed individually : one for Claus, one for Willem.
> For
> >> >> James, a dummy exception is throwed.
> >> >>
> >> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
> >> >> ProducerCache                  - >>>>
> Endpoint[direct://startWithError]
> >> >> Exchange[Message: Claus@James@Willem]
> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
> >> >> ProcessorEndpoint$1            - Starting producer:
> >> Producer[bean://error]
> >> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
> >> >> ProducerCache                  - Adding to producer cache with key:
> >> >> Endpoint[bean://error] for producer: Producer[bean://error]
> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
> >> >> BeanProcessor                  - Setting bean invocation result on
> the
> >> IN
> >> >> message: Hello Claus
> >> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
> >> >> BeanProcessor                  - Setting bean invocation result on
> the
> >> IN
> >> >> message: Hello Claus
> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> >> MockEndpoint$1                 - Starting producer:
> >> Producer[mock://result]
> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> >> ProducerCache                  - Adding to producer cache with key:
> >> >> Endpoint[mock://result] for producer: Producer[mock://result]
> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> >> MockEndpoint                   - mock://result >>>> 1 :
> >> Exchange[Message:
> >> >> Hello Claus] with body: Hello Claus
> >> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> >> Pipeline                       - Message exchange has failed so
> breaking
> >> out
> >> >> of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
> >> This
> >> >> is a dummy error James!
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> MockEndpoint$1                 - Starting producer:
> >> Producer[mock://error]
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> ProducerCache                  - Adding to producer cache with key:
> >> >> Endpoint[mock://error] for producer: Producer[mock://error]
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> MockEndpoint                   - mock://error >>>> 1 :
> Exchange[Message:
> >> >> James] with body: James
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> TryProcessor                   - The exception is handled: true for
> the
> >> >> exception: java.lang.Exception caused by: This is a dummy error
> James!
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> BeanProcessor                  - Setting bean invocation result on
> the
> >> IN
> >> >> message: Hello Willem
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> BeanProcessor                  - Setting bean invocation result on
> the
> >> IN
> >> >> message: Hello Willem
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> MockEndpoint                   - mock://result >>>> 2 :
> >> Exchange[Message:
> >> >> Hello Willem] with body: Hello Willem
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> MulticastProcessor             - Done sequientel processing 3
> exchanges
> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
> >> >> MockEndpoint                   - Asserting: Endpoint[mock://result]
> is
> >> >> satisfied
> >> >> 2009-08-12 14:41:09,264 [main           ] INFO
> >> >> MockEndpoint                   - Asserting: Endpoint[mock://error] is
> >> >> satisfied
> >> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> >> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
> >> >>
> >> >> The test succeeds but the exception is not catched in the try/catch
> >> block of
> >> >> testSplitWithError. What is wrong ?
> >> >>
> >> >> Regards,
> >> >>
> >> >> Charles
> >> >>
> >> >
> >> >
> >> >
> >> > --
> >> > Claus Ibsen
> >> > Apache Camel Committer
> >> >
> >> > Open Source Integration: http://fusesource.com
> >> > Blog: http://davsclaus.blogspot.com/
> >> > Twitter: http://twitter.com/davsclaus
> >> >
> >>
> >>
> >>
> >> --
> >> Claus Ibsen
> >> Apache Camel Committer
> >>
> >> Open Source Integration: http://fusesource.com
> >> Blog: http://davsclaus.blogspot.com/
> >> Twitter: http://twitter.com/davsclaus
> >>
> >
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>

Re: Try/catch with split

Posted by Claus Ibsen <cl...@gmail.com>.
You need try .. catch around the template when you send a message as
you do NOT handle the exception and thus the client get this exception
back.


On Fri, Aug 14, 2009 at 2:43 PM, Charles Moulliard<cm...@gmail.com> wrote:
> I have adapted the test case as you propose but it fails.
>
> org.apache.camel.CamelExecutionException: Exception occured during execution
> on the exchange: Exchange[Message: Hello Willem]
>    at
> org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
>    at
> org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
>    at
> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
>    at
> org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
>    at
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
>    at
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
>    at
> org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>    at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>    at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>    at java.lang.reflect.Method.invoke(Method.java:597)
>    at junit.framework.TestCase.runTest(TestCase.java:164)
>    at junit.framework.TestCase.runBare(TestCase.java:130)
>    at junit.framework.TestResult$1.protect(TestResult.java:106)
>    at junit.framework.TestResult.runProtected(TestResult.java:124)
>    at junit.framework.TestResult.run(TestResult.java:109)
>    at junit.framework.TestCase.run(TestCase.java:120)
>    at junit.framework.TestSuite.runTest(TestSuite.java:230)
>    at junit.framework.TestSuite.run(TestSuite.java:225)
>    at
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>    at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>    at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> Caused by: java.lang.Exception: This is a dummy error James!
>    at
> org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>    at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>    at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>    at java.lang.reflect.Method.invoke(Method.java:597)
>    at
> org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
>    at
> org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
>    at
> org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
>    at
> org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
>    at
> org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
>    at
> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
>    at
> org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
>    at
> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>    at
> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
>    at
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
>    at org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
>    at
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>    at
> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
>    at
> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>    at
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>    at
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>    at
> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>    at
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>    at
> org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
>    at
> org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
>    at
> org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
>    at
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
>    at
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>    at
> org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>    at
> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
>    at
> org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
>    at
> org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
>    at
> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
>    at
> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
>    at
> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
>    at
> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
>    at
> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
>    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
>    at
> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
>    at
> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
>    ... 20 more
>
>
>
> CODE ********************************************************
>
> import org.apache.camel.ContextTestSupport;
> import org.apache.camel.Exchange;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.component.mock.MockEndpoint;
> import org.apache.camel.impl.JndiRegistry;
>
> /**
>  * @version $Revision: 736555 $
>  */
> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>
>   public void testSplitWithError() throws Exception {
>        MockEndpoint error = getMockEndpoint("mock:error");
>        error.expectedBodiesReceived("James");
>        error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
> is a dummy error James!");
>
>        MockEndpoint result = getMockEndpoint("mock:result");
>        result.expectedBodiesReceived("Hello Claus", "Hello Willem");
>
>        template.sendBody("direct:startWithError", "Claus@James@Willem");
>
>        assertMockEndpointsSatisfied();
>    }
>
>    protected JndiRegistry createRegistry() throws Exception {
>        JndiRegistry jndi = super.createRegistry();
>        jndi.bind("error", new GenerateError());
>        return jndi;
>    }
>
>    protected RouteBuilder createRouteBuilder() {
>        return new RouteBuilder() {
>            public void configure() {
>                from("direct:startWithError")
>                    .split(body().tokenize("@"))
>                    .doTry()
>                        // GENERATE A DUMMY ERROR
>                        .to("bean:error")
>                        .to("mock:result")
>                       .doCatch(java.lang.Exception.class).handled(false)
>
> .to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
>                           .to("mock:error")
>                    .end();
>            }
>        };
>    }
>
>    public static final class GenerateError {
>        public GenerateError() {
>            // Helper Class
>        }
>
>        public String dummyException(String payload) throws Exception {
>            if (payload.equals("James")) {
>                throw new Exception("This is a dummy error James!");
>            }
>            return "Hello " + payload;
>        }
>
>    }
>
>
> }
>
> ********************************************
>
> Here is the trace of the log
>
> 2009-08-14 14:34:57,726 [main           ] INFO
> DefaultCamelContext            - JMX enabled. Using
> InstrumentationLifecycleStrategy.
> 2009-08-14 14:34:57,882 [main           ] DEBUG
> SplitterTryCatchErrorTest      - Using created route builder: Routes: []
> 2009-08-14 14:34:57,882 [main           ] DEBUG
> DefaultCamelContext            - Adding routes from builder: Routes: []
> 2009-08-14 14:34:58,132 [main           ] INFO
> DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
> starting
> 2009-08-14 14:34:58,132 [main           ] DEBUG
> DefaultProducerServicePool     - Starting service pool:
> org.apache.camel.impl.DefaultProducerServicePool@b02efa
> 2009-08-14 14:34:58,601 [main           ] DEBUG
> DefaultComponentResolver       - Found component: direct via type:
> org.apache.camel.component.direct.DirectComponent via:
> META-INF/services/org/apache/camel/component/direct
> 2009-08-14 14:34:58,601 [main           ] DEBUG
> DefaultComponent               - Creating endpoint
> uri=[direct://startWithError], path=[startWithError], parameters=[{}]
> 2009-08-14 14:34:58,616 [main           ] DEBUG
> DefaultCamelContext            - direct://startWithError converted to
> endpoint: Endpoint[direct://startWithError] by component:
> org.apache.camel.component.direct.DirectComponent@1e0f2f6
> 2009-08-14 14:34:58,695 [main           ] DEBUG
> DefaultComponentResolver       - Found component: bean via type:
> org.apache.camel.component.bean.BeanComponent via:
> META-INF/services/org/apache/camel/component/bean
> 2009-08-14 14:34:58,710 [main           ] DEBUG
> DefaultComponent               - Creating endpoint uri=[bean://error],
> path=[error], parameters=[{}]
> 2009-08-14 14:34:58,726 [main           ] DEBUG
> DefaultCamelContext            - bean://error converted to endpoint:
> Endpoint[bean://error] by component:
> org.apache.camel.component.bean.BeanComponent@1c0f2e5
> 2009-08-14 14:34:58,773 [main           ] DEBUG
> DefaultComponentResolver       - Found component: mock via type:
> org.apache.camel.component.mock.MockComponent via:
> META-INF/services/org/apache/camel/component/mock
> 2009-08-14 14:34:58,773 [main           ] DEBUG
> DefaultComponent               - Creating endpoint uri=[mock://result],
> path=[result], parameters=[{}]
> 2009-08-14 14:34:58,788 [main           ] DEBUG
> DefaultCamelContext            - mock://result converted to endpoint:
> Endpoint[mock://result] by component:
> org.apache.camel.component.mock.MockComponent@1977b9b
> 2009-08-14 14:34:58,835 [main           ] DEBUG
> DefaultComponentResolver       - Found component: log via type:
> org.apache.camel.component.log.LogComponent via:
> META-INF/services/org/apache/camel/component/log
> 2009-08-14 14:34:58,851 [main           ] DEBUG
> DefaultComponent               - Creating endpoint
> uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
> path=[org.apache.camel.processor], parameters=[{level=INFO, multiline=true,
> showCaughtException=true, showException=true, showStackTrace=false}]
> 2009-08-14 14:34:58,882 [main           ] DEBUG
> DefaultCamelContext            -
> log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
> converted to endpoint:
> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> by component: org.apache.camel.component.log.LogComponent@1a7ddcf
> 2009-08-14 14:34:58,882 [main           ] DEBUG
> DefaultComponent               - Creating endpoint uri=[mock://error],
> path=[error], parameters=[{}]
> 2009-08-14 14:34:58,882 [main           ] DEBUG
> DefaultCamelContext            - mock://error converted to endpoint:
> Endpoint[mock://error] by component:
> org.apache.camel.component.mock.MockComponent@1977b9b
> 2009-08-14 14:34:58,976 [main           ] DEBUG
> DefaultCamelContext            - Starting routes
> 2009-08-14 14:34:59,116 [main           ] DEBUG
> DirectConsumer                 - Starting consumer:
> Consumer[direct://startWithError]
> 2009-08-14 14:34:59,116 [main           ] DEBUG
> DefaultCamelContext            - Route 0:
> EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
> UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
> {Pipeline[Channel[sendTo(Endpoint[bean://error])],
> Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
> java.lang.Exception] ->
> Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
> Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
> useLatestAggregationStrategy]])]
> 2009-08-14 14:34:59,116 [main           ] DEBUG
> DefaultCamelContext            - Started routes
> 2009-08-14 14:34:59,116 [main           ] INFO
> DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> started
> 2009-08-14 14:34:59,163 [main           ] DEBUG
> DirectProducer                 - Starting producer:
> Producer[direct://startWithError]
> 2009-08-14 14:34:59,179 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[direct://startWithError] for producer:
> Producer[direct://startWithError]
> 2009-08-14 14:34:59,304 [main           ] DEBUG
> ProducerCache                  - >>>> Endpoint[direct://startWithError]
> Exchange[Message: Claus@James@Willem]
> 2009-08-14 14:34:59,413 [main           ] DEBUG
> ProcessorEndpoint$1            - Starting producer: Producer[bean://error]
> 2009-08-14 14:34:59,413 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[bean://error] for producer: Producer[bean://error]
> 2009-08-14 14:35:00,726 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.component.file.GenericFileConverter
> 2009-08-14 14:35:00,757 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
> 2009-08-14 14:35:00,757 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.StaticMethodWithExchangeTestConverter
> 2009-08-14 14:35:00,757 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.CamelConverter
> 2009-08-14 14:35:00,757 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.CollectionConverter
> 2009-08-14 14:35:00,757 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.IOConverter
> 2009-08-14 14:35:00,773 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.jaxp.DomConverter
> 2009-08-14 14:35:00,773 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.jaxp.StaxConverter
> 2009-08-14 14:35:00,788 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.jaxp.StreamSourceConverter
> 2009-08-14 14:35:00,788 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.jaxp.XmlConverter
> 2009-08-14 14:35:00,788 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.NIOConverter
> 2009-08-14 14:35:00,788 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.ObjectConverter
> 2009-08-14 14:35:00,804 [main           ] DEBUG
> AnnotationTypeConverterLoader  - Loading converter class:
> org.apache.camel.converter.stream.StreamCacheConverter
> 2009-08-14 14:35:00,804 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Claus
> 2009-08-14 14:35:00,804 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Claus
> 2009-08-14 14:35:00,804 [main           ] DEBUG
> MockEndpoint$1                 - Starting producer: Producer[mock://result]
> 2009-08-14 14:35:00,804 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[mock://result] for producer: Producer[mock://result]
> 2009-08-14 14:35:00,820 [main           ] DEBUG
> MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
> Hello Claus] with body: Hello Claus
> 2009-08-14 14:35:00,820 [main           ] DEBUG
> Pipeline                       - Message exchange has failed so breaking out
> of pipeline: Exchange[Message: James] Exception: java.lang.Exception: This
> is a dummy error James!
> 2009-08-14 14:35:00,820 [main           ] DEBUG
> ProcessorEndpoint$1            - Starting producer:
> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> 2009-08-14 14:35:00,820 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> for producer:
> Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
> 2009-08-14 14:35:00,835 [main           ] INFO
> processor                      - Exchange[
> , BodyType:String
> , Body:James
> , CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This is a
> dummy error James!]
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> MockEndpoint$1                 - Starting producer: Producer[mock://error]
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[mock://error] for producer: Producer[mock://error]
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
> James] with body: James
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> TryProcessor                   - The exception is handled: false for the
> exception: java.lang.Exception caused by: This is a dummy error James!
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> DefaultErrorHandler            - Failed delivery for exchangeId:
> ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0 caught:
> java.lang.Exception: This is a dummy error James!
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> DefaultErrorHandler            - This exchange is not handled so its marked
> as failed: Exchange[Message: James]
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Willem
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Willem
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
> Hello Willem] with body: Hello Willem
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> MulticastProcessor             - Done sequientel processing 3 exchanges
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> DefaultErrorHandler            - Failed delivery for exchangeId:
> ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0 caught:
> java.lang.Exception: This is a dummy error James!
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> DefaultErrorHandler            - This exchange is not handled so its marked
> as failed: Exchange[Message: Hello Willem]
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
> 2009-08-14 14:35:00,835 [main           ] INFO
> DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
> stopping
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> DirectConsumer                 - Stopping consumer:
> Consumer[direct://startWithError]
> 2009-08-14 14:35:00,835 [main           ] DEBUG
> DefaultProducerServicePool     - Stopping service pool:
> org.apache.camel.impl.DefaultProducerServicePool@b02efa
> 2009-08-14 14:35:00,835 [main           ] INFO
> DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
> stopped
>
> Regards,
>
> Charles Moulliard
> Senior Enterprise Architect
> Apache Camel Committer
>
> *****************************
> blog : http://cmoulliard.blogspot.com
>
>
> On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <cl...@gmail.com> wrote:
>
>> Hi
>>
>> But Camel is smart and flexible so it allows you to lower the handled
>> flag on doCatch (noticed handled(false)) so you can do like this, in
>> which the client will get the exception back in his face. And the
>> mock:error can see the caused exception from a property on the
>> exchange
>>
>>        MockEndpoint error = getMockEndpoint("mock:error");
>>        error.expectedBodiesReceived("James");
>>        error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>>
>>
>>                from("direct:start")
>>                    .split(body().tokenize("@"))
>>                    .doTry()
>>                         .to("bean:error")
>>                        .to("mock:result")
>>                     .doCatch(Exception.class).handled(false)
>>                        .to("mock:error")
>>                    .end();
>>
>>
>> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com>
>> wrote:
>> > Hi
>> >
>> > Works fine I will commit an unit test later when Hadrian is done with
>> > the build of Camel 2.0 release.
>> >
>> > 2 messages goes to mock:result
>> > 1 message go to mock:error
>> >
>> > All as expected.
>> >
>> > Since you use doTry .. doCatch the client will not receive any
>> > exception as he will not do that either when you do
>> >
>> > try {
>> >
>> > } catch (Exception e) {
>> >  .. do something
>> > }
>> >
>> > Since you do NOT rethrow the exception in the catch block. Catching an
>> > exception is like handling it = NO MORE AN EXCEPTION
>> >
>> >
>> >
>> >
>> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<cm...@gmail.com>
>> wrote:
>> >> Hi,
>> >>
>> >> I'm back again with try/catch and split. I have created the following
>> unit
>> >> test who seems to work but I don't understand why the try/catch block of
>> the
>> >> test does not receive the error ?
>> >>
>> >> Code
>> >>
>> >> package org.apache.camel.processor;
>> >>
>> >> import org.apache.camel.ContextTestSupport;
>> >> // import org.apache.camel.RuntimeCamelException;
>> >> import org.apache.camel.builder.RouteBuilder;
>> >> import org.apache.camel.component.mock.MockEndpoint;
>> >> import org.apache.camel.impl.JndiRegistry;
>> >>
>> >> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>> >>
>> >>   public void testSplitWithError() throws Exception {
>> >>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
>> >>        resultEndpoint.expectedBodiesReceived("James");
>> >>
>> >>        try {
>> >>            template.sendBody("direct:startWithError", "Claus@James
>> >> @Willem");
>> >>            //fail("Should have thrown an exception");
>> >>        } catch (Exception e) {
>> >>            assertTrue(e.getCause().getMessage().startsWith("This is a
>> dummy
>> >> error James!"));
>> >>        }
>> >>
>> >>        assertMockEndpointsSatisfied();
>> >>    }
>> >>
>> >>
>> >>    protected JndiRegistry createRegistry() throws Exception {
>> >>        JndiRegistry jndi = super.createRegistry();
>> >>        jndi.bind("error", new GenerateError());
>> >>        return jndi;
>> >>    }
>> >>
>> >>    protected RouteBuilder createRouteBuilder() {
>> >>        return new RouteBuilder() {
>> >>            public void configure() {
>> >>                from("direct:startWithError")
>> >>                    .split(body().tokenize("@"))
>> >>                    .doTry()
>> >>                        // GENERATE A DUMMY ERROR
>> >>                        .to("bean:error")
>> >>                        .to("mock:result")
>> >>                       .doCatch(java.lang.Exception.class)
>> >>                           .to("mock:error")
>> >>                    .end();
>> >>
>> >>    }
>> >>
>> >>    public static final class GenerateError {
>> >>        public GenerateError() {
>> >>            // Helper Class
>> >>        }
>> >>
>> >>        public String dummyException(String payload) throws Exception {
>> >>            if (payload.equals("James")) {
>> >>                throw new Exception("This is a dummy error James!");
>> >>            }
>> >>            return "Hello " + payload;
>> >>        }
>> >>
>> >>    }
>> >>
>> >>
>> >> }
>> >>
>> >> What I observe in the log is that the split of the body is done and each
>> >> message is processed individually : one for Claus, one for Willem. For
>> >> James, a dummy exception is throwed.
>> >>
>> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
>> >> ProducerCache                  - >>>> Endpoint[direct://startWithError]
>> >> Exchange[Message: Claus@James@Willem]
>> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>> >> ProcessorEndpoint$1            - Starting producer:
>> Producer[bean://error]
>> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
>> >> ProducerCache                  - Adding to producer cache with key:
>> >> Endpoint[bean://error] for producer: Producer[bean://error]
>> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>> >> BeanProcessor                  - Setting bean invocation result on the
>> IN
>> >> message: Hello Claus
>> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
>> >> BeanProcessor                  - Setting bean invocation result on the
>> IN
>> >> message: Hello Claus
>> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> MockEndpoint$1                 - Starting producer:
>> Producer[mock://result]
>> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> ProducerCache                  - Adding to producer cache with key:
>> >> Endpoint[mock://result] for producer: Producer[mock://result]
>> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> MockEndpoint                   - mock://result >>>> 1 :
>> Exchange[Message:
>> >> Hello Claus] with body: Hello Claus
>> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> >> Pipeline                       - Message exchange has failed so breaking
>> out
>> >> of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
>> This
>> >> is a dummy error James!
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> MockEndpoint$1                 - Starting producer:
>> Producer[mock://error]
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> ProducerCache                  - Adding to producer cache with key:
>> >> Endpoint[mock://error] for producer: Producer[mock://error]
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
>> >> James] with body: James
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> TryProcessor                   - The exception is handled: true for the
>> >> exception: java.lang.Exception caused by: This is a dummy error James!
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> BeanProcessor                  - Setting bean invocation result on the
>> IN
>> >> message: Hello Willem
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> BeanProcessor                  - Setting bean invocation result on the
>> IN
>> >> message: Hello Willem
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> MockEndpoint                   - mock://result >>>> 2 :
>> Exchange[Message:
>> >> Hello Willem] with body: Hello Willem
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> MulticastProcessor             - Done sequientel processing 3 exchanges
>> >> 2009-08-12 14:41:09,264 [main           ] INFO
>> >> MockEndpoint                   - Asserting: Endpoint[mock://result] is
>> >> satisfied
>> >> 2009-08-12 14:41:09,264 [main           ] INFO
>> >> MockEndpoint                   - Asserting: Endpoint[mock://error] is
>> >> satisfied
>> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> >> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>> >>
>> >> The test succeeds but the exception is not catched in the try/catch
>> block of
>> >> testSplitWithError. What is wrong ?
>> >>
>> >> Regards,
>> >>
>> >> Charles
>> >>
>> >
>> >
>> >
>> > --
>> > Claus Ibsen
>> > Apache Camel Committer
>> >
>> > Open Source Integration: http://fusesource.com
>> > Blog: http://davsclaus.blogspot.com/
>> > Twitter: http://twitter.com/davsclaus
>> >
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Open Source Integration: http://fusesource.com
>> Blog: http://davsclaus.blogspot.com/
>> Twitter: http://twitter.com/davsclaus
>>
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Re: Try/catch with split

Posted by Charles Moulliard <cm...@gmail.com>.
I have adapted the test case as you propose but it fails.

org.apache.camel.CamelExecutionException: Exception occured during execution
on the exchange: Exchange[Message: Hello Willem]
    at
org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1027)
    at
org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:479)
    at
org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:431)
    at
org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:427)
    at
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:112)
    at
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:117)
    at
org.apache.camel.processor.SplitterTryCatchErrorTest.testSplitWithError(SplitterTryCatchErrorTest.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:164)
    at junit.framework.TestCase.runBare(TestCase.java:130)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:120)
    at junit.framework.TestSuite.runTest(TestSuite.java:230)
    at junit.framework.TestSuite.run(TestSuite.java:225)
    at
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.Exception: This is a dummy error James!
    at
org.apache.camel.processor.SplitterTryCatchErrorTest$GenerateError.dummyException(SplitterTryCatchErrorTest.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at
org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:193)
    at
org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:115)
    at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:122)
    at
org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:95)
    at
org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:65)
    at
org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:81)
    at
org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:78)
    at
org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
    at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:78)
    at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
    at org.apache.camel.processor.TryProcessor.process(TryProcessor.java:63)
    at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
    at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:61)
    at
org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
    at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
    at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
    at
org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
    at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
    at
org.apache.camel.processor.MulticastProcessor.doProcessSequntiel(MulticastProcessor.java:189)
    at
org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:126)
    at
org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:186)
    at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:155)
    at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
    at
org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
    at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:148)
    at
org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:54)
    at
org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
    at
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:45)
    at
org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:170)
    at
org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:155)
    at
org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:141)
    at
org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:155)
    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:93)
    at
org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97)
    at
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:110)
    ... 20 more



CODE ********************************************************

import org.apache.camel.ContextTestSupport;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.JndiRegistry;

/**
 * @version $Revision: 736555 $
 */
public class SplitterTryCatchErrorTest extends ContextTestSupport {

   public void testSplitWithError() throws Exception {
        MockEndpoint error = getMockEndpoint("mock:error");
        error.expectedBodiesReceived("James");
        error.message(0).property(Exchange.EXCEPTION_CAUGHT).contains("This
is a dummy error James!");

        MockEndpoint result = getMockEndpoint("mock:result");
        result.expectedBodiesReceived("Hello Claus", "Hello Willem");

        template.sendBody("direct:startWithError", "Claus@James@Willem");

        assertMockEndpointsSatisfied();
    }

    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry jndi = super.createRegistry();
        jndi.bind("error", new GenerateError());
        return jndi;
    }

    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("direct:startWithError")
                    .split(body().tokenize("@"))
                    .doTry()
                        // GENERATE A DUMMY ERROR
                        .to("bean:error")
                        .to("mock:result")
                       .doCatch(java.lang.Exception.class).handled(false)

.to("log:org.apache.camel.processor?level=INFO&multiline=true&showException=true&showCaughtException=true&showStackTrace=false")
                           .to("mock:error")
                    .end();
            }
        };
    }

    public static final class GenerateError {
        public GenerateError() {
            // Helper Class
        }

        public String dummyException(String payload) throws Exception {
            if (payload.equals("James")) {
                throw new Exception("This is a dummy error James!");
            }
            return "Hello " + payload;
        }

    }


}

********************************************

Here is the trace of the log

2009-08-14 14:34:57,726 [main           ] INFO
DefaultCamelContext            - JMX enabled. Using
InstrumentationLifecycleStrategy.
2009-08-14 14:34:57,882 [main           ] DEBUG
SplitterTryCatchErrorTest      - Using created route builder: Routes: []
2009-08-14 14:34:57,882 [main           ] DEBUG
DefaultCamelContext            - Adding routes from builder: Routes: []
2009-08-14 14:34:58,132 [main           ] INFO
DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
starting
2009-08-14 14:34:58,132 [main           ] DEBUG
DefaultProducerServicePool     - Starting service pool:
org.apache.camel.impl.DefaultProducerServicePool@b02efa
2009-08-14 14:34:58,601 [main           ] DEBUG
DefaultComponentResolver       - Found component: direct via type:
org.apache.camel.component.direct.DirectComponent via:
META-INF/services/org/apache/camel/component/direct
2009-08-14 14:34:58,601 [main           ] DEBUG
DefaultComponent               - Creating endpoint
uri=[direct://startWithError], path=[startWithError], parameters=[{}]
2009-08-14 14:34:58,616 [main           ] DEBUG
DefaultCamelContext            - direct://startWithError converted to
endpoint: Endpoint[direct://startWithError] by component:
org.apache.camel.component.direct.DirectComponent@1e0f2f6
2009-08-14 14:34:58,695 [main           ] DEBUG
DefaultComponentResolver       - Found component: bean via type:
org.apache.camel.component.bean.BeanComponent via:
META-INF/services/org/apache/camel/component/bean
2009-08-14 14:34:58,710 [main           ] DEBUG
DefaultComponent               - Creating endpoint uri=[bean://error],
path=[error], parameters=[{}]
2009-08-14 14:34:58,726 [main           ] DEBUG
DefaultCamelContext            - bean://error converted to endpoint:
Endpoint[bean://error] by component:
org.apache.camel.component.bean.BeanComponent@1c0f2e5
2009-08-14 14:34:58,773 [main           ] DEBUG
DefaultComponentResolver       - Found component: mock via type:
org.apache.camel.component.mock.MockComponent via:
META-INF/services/org/apache/camel/component/mock
2009-08-14 14:34:58,773 [main           ] DEBUG
DefaultComponent               - Creating endpoint uri=[mock://result],
path=[result], parameters=[{}]
2009-08-14 14:34:58,788 [main           ] DEBUG
DefaultCamelContext            - mock://result converted to endpoint:
Endpoint[mock://result] by component:
org.apache.camel.component.mock.MockComponent@1977b9b
2009-08-14 14:34:58,835 [main           ] DEBUG
DefaultComponentResolver       - Found component: log via type:
org.apache.camel.component.log.LogComponent via:
META-INF/services/org/apache/camel/component/log
2009-08-14 14:34:58,851 [main           ] DEBUG
DefaultComponent               - Creating endpoint
uri=[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false],
path=[org.apache.camel.processor], parameters=[{level=INFO, multiline=true,
showCaughtException=true, showException=true, showStackTrace=false}]
2009-08-14 14:34:58,882 [main           ] DEBUG
DefaultCamelContext            -
log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false
converted to endpoint:
Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
by component: org.apache.camel.component.log.LogComponent@1a7ddcf
2009-08-14 14:34:58,882 [main           ] DEBUG
DefaultComponent               - Creating endpoint uri=[mock://error],
path=[error], parameters=[{}]
2009-08-14 14:34:58,882 [main           ] DEBUG
DefaultCamelContext            - mock://error converted to endpoint:
Endpoint[mock://error] by component:
org.apache.camel.component.mock.MockComponent@1977b9b
2009-08-14 14:34:58,976 [main           ] DEBUG
DefaultCamelContext            - Starting routes
2009-08-14 14:34:59,116 [main           ] DEBUG
DirectConsumer                 - Starting consumer:
Consumer[direct://startWithError]
2009-08-14 14:34:59,116 [main           ] DEBUG
DefaultCamelContext            - Route 0:
EventDrivenConsumerRoute[Endpoint[direct://startWithError] ->
UnitOfWork(Channel[Splitter[on: tokenize(body, @) to: Channel[Try
{Pipeline[Channel[sendTo(Endpoint[bean://error])],
Channel[sendTo(Endpoint[mock://result])]]} [Catch[[class
java.lang.Exception] ->
Pipeline[Channel[sendTo(Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false])],
Channel[sendTo(Endpoint[mock://error])]]]]] aggregate:
useLatestAggregationStrategy]])]
2009-08-14 14:34:59,116 [main           ] DEBUG
DefaultCamelContext            - Started routes
2009-08-14 14:34:59,116 [main           ] INFO
DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
started
2009-08-14 14:34:59,163 [main           ] DEBUG
DirectProducer                 - Starting producer:
Producer[direct://startWithError]
2009-08-14 14:34:59,179 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[direct://startWithError] for producer:
Producer[direct://startWithError]
2009-08-14 14:34:59,304 [main           ] DEBUG
ProducerCache                  - >>>> Endpoint[direct://startWithError]
Exchange[Message: Claus@James@Willem]
2009-08-14 14:34:59,413 [main           ] DEBUG
ProcessorEndpoint$1            - Starting producer: Producer[bean://error]
2009-08-14 14:34:59,413 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[bean://error] for producer: Producer[bean://error]
2009-08-14 14:35:00,726 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.component.file.GenericFileConverter
2009-08-14 14:35:00,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.InstanceMethodWithExchangeTestConverter
2009-08-14 14:35:00,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.StaticMethodWithExchangeTestConverter
2009-08-14 14:35:00,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.CamelConverter
2009-08-14 14:35:00,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.CollectionConverter
2009-08-14 14:35:00,757 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.IOConverter
2009-08-14 14:35:00,773 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.DomConverter
2009-08-14 14:35:00,773 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.StaxConverter
2009-08-14 14:35:00,788 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.StreamSourceConverter
2009-08-14 14:35:00,788 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.jaxp.XmlConverter
2009-08-14 14:35:00,788 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.NIOConverter
2009-08-14 14:35:00,788 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.ObjectConverter
2009-08-14 14:35:00,804 [main           ] DEBUG
AnnotationTypeConverterLoader  - Loading converter class:
org.apache.camel.converter.stream.StreamCacheConverter
2009-08-14 14:35:00,804 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Claus
2009-08-14 14:35:00,804 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Claus
2009-08-14 14:35:00,804 [main           ] DEBUG
MockEndpoint$1                 - Starting producer: Producer[mock://result]
2009-08-14 14:35:00,804 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[mock://result] for producer: Producer[mock://result]
2009-08-14 14:35:00,820 [main           ] DEBUG
MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
Hello Claus] with body: Hello Claus
2009-08-14 14:35:00,820 [main           ] DEBUG
Pipeline                       - Message exchange has failed so breaking out
of pipeline: Exchange[Message: James] Exception: java.lang.Exception: This
is a dummy error James!
2009-08-14 14:35:00,820 [main           ] DEBUG
ProcessorEndpoint$1            - Starting producer:
Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
2009-08-14 14:35:00,820 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
for producer:
Producer[log://org.apache.camel.processor?level=INFO&multiline=true&showCaughtException=true&showException=true&showStackTrace=false]
2009-08-14 14:35:00,835 [main           ] INFO
processor                      - Exchange[
, BodyType:String
, Body:James
, CaughtExceptionType:java.lang.Exception, CaughtExceptionMessage:This is a
dummy error James!]
2009-08-14 14:35:00,835 [main           ] DEBUG
MockEndpoint$1                 - Starting producer: Producer[mock://error]
2009-08-14 14:35:00,835 [main           ] DEBUG
ProducerCache                  - Adding to producer cache with key:
Endpoint[mock://error] for producer: Producer[mock://error]
2009-08-14 14:35:00,835 [main           ] DEBUG
MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
James] with body: James
2009-08-14 14:35:00,835 [main           ] DEBUG
TryProcessor                   - The exception is handled: false for the
exception: java.lang.Exception caused by: This is a dummy error James!
2009-08-14 14:35:00,835 [main           ] DEBUG
DefaultErrorHandler            - Failed delivery for exchangeId:
ID-dell-charles-2915-1250253299195-0-2. On delivery attempt: 0 caught:
java.lang.Exception: This is a dummy error James!
2009-08-14 14:35:00,835 [main           ] DEBUG
DefaultErrorHandler            - This exchange is not handled so its marked
as failed: Exchange[Message: James]
2009-08-14 14:35:00,835 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Willem
2009-08-14 14:35:00,835 [main           ] DEBUG
BeanProcessor                  - Setting bean invocation result on the IN
message: Hello Willem
2009-08-14 14:35:00,835 [main           ] DEBUG
MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
Hello Willem] with body: Hello Willem
2009-08-14 14:35:00,835 [main           ] DEBUG
MulticastProcessor             - Done sequientel processing 3 exchanges
2009-08-14 14:35:00,835 [main           ] DEBUG
DefaultErrorHandler            - Failed delivery for exchangeId:
ID-dell-charles-2915-1250253299195-0-4. On delivery attempt: 0 caught:
java.lang.Exception: This is a dummy error James!
2009-08-14 14:35:00,835 [main           ] DEBUG
DefaultErrorHandler            - This exchange is not handled so its marked
as failed: Exchange[Message: Hello Willem]
2009-08-14 14:35:00,835 [main           ] DEBUG
SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
2009-08-14 14:35:00,835 [main           ] INFO
DefaultCamelContext            - Apache Camel  (CamelContext:camel-1) is
stopping
2009-08-14 14:35:00,835 [main           ] DEBUG
DirectConsumer                 - Stopping consumer:
Consumer[direct://startWithError]
2009-08-14 14:35:00,835 [main           ] DEBUG
DefaultProducerServicePool     - Stopping service pool:
org.apache.camel.impl.DefaultProducerServicePool@b02efa
2009-08-14 14:35:00,835 [main           ] INFO
DefaultCamelContext            - Apache Camel  (CamelContext:camel-1)
stopped

Regards,

Charles Moulliard
Senior Enterprise Architect
Apache Camel Committer

*****************************
blog : http://cmoulliard.blogspot.com


On Fri, Aug 14, 2009 at 10:50 AM, Claus Ibsen <cl...@gmail.com> wrote:

> Hi
>
> But Camel is smart and flexible so it allows you to lower the handled
> flag on doCatch (noticed handled(false)) so you can do like this, in
> which the client will get the exception back in his face. And the
> mock:error can see the caused exception from a property on the
> exchange
>
>        MockEndpoint error = getMockEndpoint("mock:error");
>        error.expectedBodiesReceived("James");
>        error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();
>
>
>                from("direct:start")
>                    .split(body().tokenize("@"))
>                    .doTry()
>                         .to("bean:error")
>                        .to("mock:result")
>                     .doCatch(Exception.class).handled(false)
>                        .to("mock:error")
>                    .end();
>
>
> On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com>
> wrote:
> > Hi
> >
> > Works fine I will commit an unit test later when Hadrian is done with
> > the build of Camel 2.0 release.
> >
> > 2 messages goes to mock:result
> > 1 message go to mock:error
> >
> > All as expected.
> >
> > Since you use doTry .. doCatch the client will not receive any
> > exception as he will not do that either when you do
> >
> > try {
> >
> > } catch (Exception e) {
> >  .. do something
> > }
> >
> > Since you do NOT rethrow the exception in the catch block. Catching an
> > exception is like handling it = NO MORE AN EXCEPTION
> >
> >
> >
> >
> > On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<cm...@gmail.com>
> wrote:
> >> Hi,
> >>
> >> I'm back again with try/catch and split. I have created the following
> unit
> >> test who seems to work but I don't understand why the try/catch block of
> the
> >> test does not receive the error ?
> >>
> >> Code
> >>
> >> package org.apache.camel.processor;
> >>
> >> import org.apache.camel.ContextTestSupport;
> >> // import org.apache.camel.RuntimeCamelException;
> >> import org.apache.camel.builder.RouteBuilder;
> >> import org.apache.camel.component.mock.MockEndpoint;
> >> import org.apache.camel.impl.JndiRegistry;
> >>
> >> public class SplitterTryCatchErrorTest extends ContextTestSupport {
> >>
> >>   public void testSplitWithError() throws Exception {
> >>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
> >>        resultEndpoint.expectedBodiesReceived("James");
> >>
> >>        try {
> >>            template.sendBody("direct:startWithError", "Claus@James
> >> @Willem");
> >>            //fail("Should have thrown an exception");
> >>        } catch (Exception e) {
> >>            assertTrue(e.getCause().getMessage().startsWith("This is a
> dummy
> >> error James!"));
> >>        }
> >>
> >>        assertMockEndpointsSatisfied();
> >>    }
> >>
> >>
> >>    protected JndiRegistry createRegistry() throws Exception {
> >>        JndiRegistry jndi = super.createRegistry();
> >>        jndi.bind("error", new GenerateError());
> >>        return jndi;
> >>    }
> >>
> >>    protected RouteBuilder createRouteBuilder() {
> >>        return new RouteBuilder() {
> >>            public void configure() {
> >>                from("direct:startWithError")
> >>                    .split(body().tokenize("@"))
> >>                    .doTry()
> >>                        // GENERATE A DUMMY ERROR
> >>                        .to("bean:error")
> >>                        .to("mock:result")
> >>                       .doCatch(java.lang.Exception.class)
> >>                           .to("mock:error")
> >>                    .end();
> >>
> >>    }
> >>
> >>    public static final class GenerateError {
> >>        public GenerateError() {
> >>            // Helper Class
> >>        }
> >>
> >>        public String dummyException(String payload) throws Exception {
> >>            if (payload.equals("James")) {
> >>                throw new Exception("This is a dummy error James!");
> >>            }
> >>            return "Hello " + payload;
> >>        }
> >>
> >>    }
> >>
> >>
> >> }
> >>
> >> What I observe in the log is that the split of the body is done and each
> >> message is processed individually : one for Claus, one for Willem. For
> >> James, a dummy exception is throwed.
> >>
> >> 2009-08-12 14:41:06,701 [main           ] DEBUG
> >> ProducerCache                  - >>>> Endpoint[direct://startWithError]
> >> Exchange[Message: Claus@James@Willem]
> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
> >> ProcessorEndpoint$1            - Starting producer:
> Producer[bean://error]
> >> 2009-08-12 14:41:06,811 [main           ] DEBUG
> >> ProducerCache                  - Adding to producer cache with key:
> >> Endpoint[bean://error] for producer: Producer[bean://error]
> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
> >> BeanProcessor                  - Setting bean invocation result on the
> IN
> >> message: Hello Claus
> >> 2009-08-12 14:41:09,233 [main           ] DEBUG
> >> BeanProcessor                  - Setting bean invocation result on the
> IN
> >> message: Hello Claus
> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> MockEndpoint$1                 - Starting producer:
> Producer[mock://result]
> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> ProducerCache                  - Adding to producer cache with key:
> >> Endpoint[mock://result] for producer: Producer[mock://result]
> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> MockEndpoint                   - mock://result >>>> 1 :
> Exchange[Message:
> >> Hello Claus] with body: Hello Claus
> >> 2009-08-12 14:41:09,248 [main           ] DEBUG
> >> Pipeline                       - Message exchange has failed so breaking
> out
> >> of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
> This
> >> is a dummy error James!
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> MockEndpoint$1                 - Starting producer:
> Producer[mock://error]
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> ProducerCache                  - Adding to producer cache with key:
> >> Endpoint[mock://error] for producer: Producer[mock://error]
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
> >> James] with body: James
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> TryProcessor                   - The exception is handled: true for the
> >> exception: java.lang.Exception caused by: This is a dummy error James!
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> BeanProcessor                  - Setting bean invocation result on the
> IN
> >> message: Hello Willem
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> BeanProcessor                  - Setting bean invocation result on the
> IN
> >> message: Hello Willem
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> MockEndpoint                   - mock://result >>>> 2 :
> Exchange[Message:
> >> Hello Willem] with body: Hello Willem
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> MulticastProcessor             - Done sequientel processing 3 exchanges
> >> 2009-08-12 14:41:09,264 [main           ] INFO
> >> MockEndpoint                   - Asserting: Endpoint[mock://result] is
> >> satisfied
> >> 2009-08-12 14:41:09,264 [main           ] INFO
> >> MockEndpoint                   - Asserting: Endpoint[mock://error] is
> >> satisfied
> >> 2009-08-12 14:41:09,264 [main           ] DEBUG
> >> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
> >>
> >> The test succeeds but the exception is not catched in the try/catch
> block of
> >> testSplitWithError. What is wrong ?
> >>
> >> Regards,
> >>
> >> Charles
> >>
> >
> >
> >
> > --
> > Claus Ibsen
> > Apache Camel Committer
> >
> > Open Source Integration: http://fusesource.com
> > Blog: http://davsclaus.blogspot.com/
> > Twitter: http://twitter.com/davsclaus
> >
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>

Re: Try/catch with split

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

But Camel is smart and flexible so it allows you to lower the handled
flag on doCatch (noticed handled(false)) so you can do like this, in
which the client will get the exception back in his face. And the
mock:error can see the caused exception from a property on the
exchange

        MockEndpoint error = getMockEndpoint("mock:error");
        error.expectedBodiesReceived("James");
        error.message(0).property(Exchange.EXCEPTION_CAUGHT).isNotNull();


                from("direct:start")
                    .split(body().tokenize("@"))
                    .doTry()
                        .to("bean:error")
                        .to("mock:result")
                    .doCatch(Exception.class).handled(false)
                        .to("mock:error")
                    .end();


On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen<cl...@gmail.com> wrote:
> Hi
>
> Works fine I will commit an unit test later when Hadrian is done with
> the build of Camel 2.0 release.
>
> 2 messages goes to mock:result
> 1 message go to mock:error
>
> All as expected.
>
> Since you use doTry .. doCatch the client will not receive any
> exception as he will not do that either when you do
>
> try {
>
> } catch (Exception e) {
>  .. do something
> }
>
> Since you do NOT rethrow the exception in the catch block. Catching an
> exception is like handling it = NO MORE AN EXCEPTION
>
>
>
>
> On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<cm...@gmail.com> wrote:
>> Hi,
>>
>> I'm back again with try/catch and split. I have created the following unit
>> test who seems to work but I don't understand why the try/catch block of the
>> test does not receive the error ?
>>
>> Code
>>
>> package org.apache.camel.processor;
>>
>> import org.apache.camel.ContextTestSupport;
>> // import org.apache.camel.RuntimeCamelException;
>> import org.apache.camel.builder.RouteBuilder;
>> import org.apache.camel.component.mock.MockEndpoint;
>> import org.apache.camel.impl.JndiRegistry;
>>
>> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>>
>>   public void testSplitWithError() throws Exception {
>>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
>>        resultEndpoint.expectedBodiesReceived("James");
>>
>>        try {
>>            template.sendBody("direct:startWithError", "Claus@James
>> @Willem");
>>            //fail("Should have thrown an exception");
>>        } catch (Exception e) {
>>            assertTrue(e.getCause().getMessage().startsWith("This is a dummy
>> error James!"));
>>        }
>>
>>        assertMockEndpointsSatisfied();
>>    }
>>
>>
>>    protected JndiRegistry createRegistry() throws Exception {
>>        JndiRegistry jndi = super.createRegistry();
>>        jndi.bind("error", new GenerateError());
>>        return jndi;
>>    }
>>
>>    protected RouteBuilder createRouteBuilder() {
>>        return new RouteBuilder() {
>>            public void configure() {
>>                from("direct:startWithError")
>>                    .split(body().tokenize("@"))
>>                    .doTry()
>>                        // GENERATE A DUMMY ERROR
>>                        .to("bean:error")
>>                        .to("mock:result")
>>                       .doCatch(java.lang.Exception.class)
>>                           .to("mock:error")
>>                    .end();
>>
>>    }
>>
>>    public static final class GenerateError {
>>        public GenerateError() {
>>            // Helper Class
>>        }
>>
>>        public String dummyException(String payload) throws Exception {
>>            if (payload.equals("James")) {
>>                throw new Exception("This is a dummy error James!");
>>            }
>>            return "Hello " + payload;
>>        }
>>
>>    }
>>
>>
>> }
>>
>> What I observe in the log is that the split of the body is done and each
>> message is processed individually : one for Claus, one for Willem. For
>> James, a dummy exception is throwed.
>>
>> 2009-08-12 14:41:06,701 [main           ] DEBUG
>> ProducerCache                  - >>>> Endpoint[direct://startWithError]
>> Exchange[Message: Claus@James@Willem]
>> 2009-08-12 14:41:06,811 [main           ] DEBUG
>> ProcessorEndpoint$1            - Starting producer: Producer[bean://error]
>> 2009-08-12 14:41:06,811 [main           ] DEBUG
>> ProducerCache                  - Adding to producer cache with key:
>> Endpoint[bean://error] for producer: Producer[bean://error]
>> 2009-08-12 14:41:09,233 [main           ] DEBUG
>> BeanProcessor                  - Setting bean invocation result on the IN
>> message: Hello Claus
>> 2009-08-12 14:41:09,233 [main           ] DEBUG
>> BeanProcessor                  - Setting bean invocation result on the IN
>> message: Hello Claus
>> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> MockEndpoint$1                 - Starting producer: Producer[mock://result]
>> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> ProducerCache                  - Adding to producer cache with key:
>> Endpoint[mock://result] for producer: Producer[mock://result]
>> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
>> Hello Claus] with body: Hello Claus
>> 2009-08-12 14:41:09,248 [main           ] DEBUG
>> Pipeline                       - Message exchange has failed so breaking out
>> of pipeline: Exchange[Message: James] Exception: java.lang.Exception: This
>> is a dummy error James!
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> MockEndpoint$1                 - Starting producer: Producer[mock://error]
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> ProducerCache                  - Adding to producer cache with key:
>> Endpoint[mock://error] for producer: Producer[mock://error]
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
>> James] with body: James
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> TryProcessor                   - The exception is handled: true for the
>> exception: java.lang.Exception caused by: This is a dummy error James!
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> BeanProcessor                  - Setting bean invocation result on the IN
>> message: Hello Willem
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> BeanProcessor                  - Setting bean invocation result on the IN
>> message: Hello Willem
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
>> Hello Willem] with body: Hello Willem
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> MulticastProcessor             - Done sequientel processing 3 exchanges
>> 2009-08-12 14:41:09,264 [main           ] INFO
>> MockEndpoint                   - Asserting: Endpoint[mock://result] is
>> satisfied
>> 2009-08-12 14:41:09,264 [main           ] INFO
>> MockEndpoint                   - Asserting: Endpoint[mock://error] is
>> satisfied
>> 2009-08-12 14:41:09,264 [main           ] DEBUG
>> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>>
>> The test succeeds but the exception is not catched in the try/catch block of
>> testSplitWithError. What is wrong ?
>>
>> Regards,
>>
>> Charles
>>
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Re: Try/catch with split

Posted by Charles Moulliard <cm...@gmail.com>.
Many thank.

I will test now the Spring DSL version as this is with Spring DSL that I
have the issue in my camel route project.

Regards,

Charles


On Fri, Aug 14, 2009 at 10:44 AM, Claus Ibsen <cl...@gmail.com> wrote:

> Hi
>
> Works fine I will commit an unit test later when Hadrian is done with
> the build of Camel 2.0 release.
>
> 2 messages goes to mock:result
> 1 message go to mock:error
>
> All as expected.
>
> Since you use doTry .. doCatch the client will not receive any
> exception as he will not do that either when you do
>
> try {
>
> } catch (Exception e) {
>  .. do something
> }
>
> Since you do NOT rethrow the exception in the catch block. Catching an
> exception is like handling it = NO MORE AN EXCEPTION
>
>
>
>
> On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<cm...@gmail.com>
> wrote:
> > Hi,
> >
> > I'm back again with try/catch and split. I have created the following
> unit
> > test who seems to work but I don't understand why the try/catch block of
> the
> > test does not receive the error ?
> >
> > Code
> >
> > package org.apache.camel.processor;
> >
> > import org.apache.camel.ContextTestSupport;
> > // import org.apache.camel.RuntimeCamelException;
> > import org.apache.camel.builder.RouteBuilder;
> > import org.apache.camel.component.mock.MockEndpoint;
> > import org.apache.camel.impl.JndiRegistry;
> >
> > public class SplitterTryCatchErrorTest extends ContextTestSupport {
> >
> >   public void testSplitWithError() throws Exception {
> >        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
> >        resultEndpoint.expectedBodiesReceived("James");
> >
> >        try {
> >            template.sendBody("direct:startWithError", "Claus@James
> > @Willem");
> >            //fail("Should have thrown an exception");
> >        } catch (Exception e) {
> >            assertTrue(e.getCause().getMessage().startsWith("This is a
> dummy
> > error James!"));
> >        }
> >
> >        assertMockEndpointsSatisfied();
> >    }
> >
> >
> >    protected JndiRegistry createRegistry() throws Exception {
> >        JndiRegistry jndi = super.createRegistry();
> >        jndi.bind("error", new GenerateError());
> >        return jndi;
> >    }
> >
> >    protected RouteBuilder createRouteBuilder() {
> >        return new RouteBuilder() {
> >            public void configure() {
> >                from("direct:startWithError")
> >                    .split(body().tokenize("@"))
> >                    .doTry()
> >                        // GENERATE A DUMMY ERROR
> >                        .to("bean:error")
> >                        .to("mock:result")
> >                       .doCatch(java.lang.Exception.class)
> >                           .to("mock:error")
> >                    .end();
> >
> >    }
> >
> >    public static final class GenerateError {
> >        public GenerateError() {
> >            // Helper Class
> >        }
> >
> >        public String dummyException(String payload) throws Exception {
> >            if (payload.equals("James")) {
> >                throw new Exception("This is a dummy error James!");
> >            }
> >            return "Hello " + payload;
> >        }
> >
> >    }
> >
> >
> > }
> >
> > What I observe in the log is that the split of the body is done and each
> > message is processed individually : one for Claus, one for Willem. For
> > James, a dummy exception is throwed.
> >
> > 2009-08-12 14:41:06,701 [main           ] DEBUG
> > ProducerCache                  - >>>> Endpoint[direct://startWithError]
> > Exchange[Message: Claus@James@Willem]
> > 2009-08-12 14:41:06,811 [main           ] DEBUG
> > ProcessorEndpoint$1            - Starting producer:
> Producer[bean://error]
> > 2009-08-12 14:41:06,811 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[bean://error] for producer: Producer[bean://error]
> > 2009-08-12 14:41:09,233 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Claus
> > 2009-08-12 14:41:09,233 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Claus
> > 2009-08-12 14:41:09,248 [main           ] DEBUG
> > MockEndpoint$1                 - Starting producer:
> Producer[mock://result]
> > 2009-08-12 14:41:09,248 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[mock://result] for producer: Producer[mock://result]
> > 2009-08-12 14:41:09,248 [main           ] DEBUG
> > MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
> > Hello Claus] with body: Hello Claus
> > 2009-08-12 14:41:09,248 [main           ] DEBUG
> > Pipeline                       - Message exchange has failed so breaking
> out
> > of pipeline: Exchange[Message: James] Exception: java.lang.Exception:
> This
> > is a dummy error James!
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > MockEndpoint$1                 - Starting producer:
> Producer[mock://error]
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > ProducerCache                  - Adding to producer cache with key:
> > Endpoint[mock://error] for producer: Producer[mock://error]
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
> > James] with body: James
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > TryProcessor                   - The exception is handled: true for the
> > exception: java.lang.Exception caused by: This is a dummy error James!
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Willem
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > BeanProcessor                  - Setting bean invocation result on the IN
> > message: Hello Willem
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
> > Hello Willem] with body: Hello Willem
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > MulticastProcessor             - Done sequientel processing 3 exchanges
> > 2009-08-12 14:41:09,264 [main           ] INFO
> > MockEndpoint                   - Asserting: Endpoint[mock://result] is
> > satisfied
> > 2009-08-12 14:41:09,264 [main           ] INFO
> > MockEndpoint                   - Asserting: Endpoint[mock://error] is
> > satisfied
> > 2009-08-12 14:41:09,264 [main           ] DEBUG
> > SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
> >
> > The test succeeds but the exception is not catched in the try/catch block
> of
> > testSplitWithError. What is wrong ?
> >
> > Regards,
> >
> > Charles
> >
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>

Re: Try/catch with split

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

Works fine I will commit an unit test later when Hadrian is done with
the build of Camel 2.0 release.

2 messages goes to mock:result
1 message go to mock:error

All as expected.

Since you use doTry .. doCatch the client will not receive any
exception as he will not do that either when you do

try {

} catch (Exception e) {
  .. do something
}

Since you do NOT rethrow the exception in the catch block. Catching an
exception is like handling it = NO MORE AN EXCEPTION




On Wed, Aug 12, 2009 at 2:53 PM, Charles Moulliard<cm...@gmail.com> wrote:
> Hi,
>
> I'm back again with try/catch and split. I have created the following unit
> test who seems to work but I don't understand why the try/catch block of the
> test does not receive the error ?
>
> Code
>
> package org.apache.camel.processor;
>
> import org.apache.camel.ContextTestSupport;
> // import org.apache.camel.RuntimeCamelException;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.component.mock.MockEndpoint;
> import org.apache.camel.impl.JndiRegistry;
>
> public class SplitterTryCatchErrorTest extends ContextTestSupport {
>
>   public void testSplitWithError() throws Exception {
>        MockEndpoint resultEndpoint = getMockEndpoint("mock:error");
>        resultEndpoint.expectedBodiesReceived("James");
>
>        try {
>            template.sendBody("direct:startWithError", "Claus@James
> @Willem");
>            //fail("Should have thrown an exception");
>        } catch (Exception e) {
>            assertTrue(e.getCause().getMessage().startsWith("This is a dummy
> error James!"));
>        }
>
>        assertMockEndpointsSatisfied();
>    }
>
>
>    protected JndiRegistry createRegistry() throws Exception {
>        JndiRegistry jndi = super.createRegistry();
>        jndi.bind("error", new GenerateError());
>        return jndi;
>    }
>
>    protected RouteBuilder createRouteBuilder() {
>        return new RouteBuilder() {
>            public void configure() {
>                from("direct:startWithError")
>                    .split(body().tokenize("@"))
>                    .doTry()
>                        // GENERATE A DUMMY ERROR
>                        .to("bean:error")
>                        .to("mock:result")
>                       .doCatch(java.lang.Exception.class)
>                           .to("mock:error")
>                    .end();
>
>    }
>
>    public static final class GenerateError {
>        public GenerateError() {
>            // Helper Class
>        }
>
>        public String dummyException(String payload) throws Exception {
>            if (payload.equals("James")) {
>                throw new Exception("This is a dummy error James!");
>            }
>            return "Hello " + payload;
>        }
>
>    }
>
>
> }
>
> What I observe in the log is that the split of the body is done and each
> message is processed individually : one for Claus, one for Willem. For
> James, a dummy exception is throwed.
>
> 2009-08-12 14:41:06,701 [main           ] DEBUG
> ProducerCache                  - >>>> Endpoint[direct://startWithError]
> Exchange[Message: Claus@James@Willem]
> 2009-08-12 14:41:06,811 [main           ] DEBUG
> ProcessorEndpoint$1            - Starting producer: Producer[bean://error]
> 2009-08-12 14:41:06,811 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[bean://error] for producer: Producer[bean://error]
> 2009-08-12 14:41:09,233 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Claus
> 2009-08-12 14:41:09,233 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Claus
> 2009-08-12 14:41:09,248 [main           ] DEBUG
> MockEndpoint$1                 - Starting producer: Producer[mock://result]
> 2009-08-12 14:41:09,248 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[mock://result] for producer: Producer[mock://result]
> 2009-08-12 14:41:09,248 [main           ] DEBUG
> MockEndpoint                   - mock://result >>>> 1 : Exchange[Message:
> Hello Claus] with body: Hello Claus
> 2009-08-12 14:41:09,248 [main           ] DEBUG
> Pipeline                       - Message exchange has failed so breaking out
> of pipeline: Exchange[Message: James] Exception: java.lang.Exception: This
> is a dummy error James!
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> MockEndpoint$1                 - Starting producer: Producer[mock://error]
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> ProducerCache                  - Adding to producer cache with key:
> Endpoint[mock://error] for producer: Producer[mock://error]
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> MockEndpoint                   - mock://error >>>> 1 : Exchange[Message:
> James] with body: James
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> TryProcessor                   - The exception is handled: true for the
> exception: java.lang.Exception caused by: This is a dummy error James!
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Willem
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> BeanProcessor                  - Setting bean invocation result on the IN
> message: Hello Willem
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> MockEndpoint                   - mock://result >>>> 2 : Exchange[Message:
> Hello Willem] with body: Hello Willem
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> MulticastProcessor             - Done sequientel processing 3 exchanges
> 2009-08-12 14:41:09,264 [main           ] INFO
> MockEndpoint                   - Asserting: Endpoint[mock://result] is
> satisfied
> 2009-08-12 14:41:09,264 [main           ] INFO
> MockEndpoint                   - Asserting: Endpoint[mock://error] is
> satisfied
> 2009-08-12 14:41:09,264 [main           ] DEBUG
> SplitterTryCatchErrorTest      - tearDown test: testSplitWithError
>
> The test succeeds but the exception is not catched in the try/catch block of
> testSplitWithError. What is wrong ?
>
> Regards,
>
> Charles
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus