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&multiline=true&showException=true&showCaughtException=true&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: cl...@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.classpathxmlapplicationcont...@16fe0f4: display name [org.springframework.context.support.classpathxmlapplicationcont...@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 <cmoulli...@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&multiline=true&showException=true&showCaughtException=true&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 > <cmoulli...@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", "cl...@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.ib...@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<cmoulli...@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", "cl...@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.defaultproducerservicep...@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.directcompon...@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.beancompon...@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.mockcompon...@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.logcompon...@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.mockcompon...@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: cl...@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.defaultproducerservicep...@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.ib...@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.ib...@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< >>> cmoulli...@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", "cl...@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: cl...@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 >>> >> >> >