Ok, any best practises for handling this. We are using jboss-fuse with its osgi container and bundles. And working in a bundle with direct between the sub-routes. However some sub-routes handled common reusable functionality, so we moved these reusable sub-routes to a common bundle and used direct-vm to talk to them. However here we were surprised when understanding that if error handling in sub-route the original message can not be restored.
What I can think of. 1. Store original message as a property on the exchange before calling direct-vm, and let error handling route fetch this property. 2. In some way use a wiretap before calling direct-vm. Any input on best practises/patterns for this use case is appreciated On Fri, Feb 28, 2014 at 8:09 AM, Claus Ibsen <claus.ib...@gmail.com> wrote: > No this is working as designed. > > > > On Fri, Feb 28, 2014 at 1:01 AM, Christian Posta > <christian.po...@gmail.com> wrote: > > Can you please open a JIRA and attach these (test/patch) and approve > > us to use this code? I can review it and get it in for you. > > > > On Thu, Feb 27, 2014 at 3:52 PM, Karsten Vileid <kmgvil...@gmail.com> > wrote: > >> I use the deadLetterChannel errorHandler with useOriginalMessage. > However > >> if using direct-vm for a sub-route then the original message is not > sent to > >> the deadLetterChannel, if an exception occurs in the sub-route. > >> I see that the problem is that direct-vm creates a new UOW, hence the > >> sub-route will consider whatever message enters the direct-vm as the > >> original message (in contrast to direct which resuses existing UOW) > >> This different behaviour between direct and direct-vm, do anyone know if > >> this is a feature? > >> > >> Below is a TestCase reproducing my observation. (Tested with Camel > version > >> 2.12.3 and latest from github) > >> > >> import org.apache.camel.EndpointInject; > >> import org.apache.camel.builder.RouteBuilder; > >> import org.apache.camel.component.mock.MockEndpoint; > >> import org.apache.camel.test.junit4.CamelTestSupport; > >> import org.junit.Test; > >> > >> public class DirectVMTest extends CamelTestSupport { > >> public RouteBuilder createRouteBuilder() { > >> return new DirectVmRoute(); > >> } > >> > >> @EndpointInject(uri = "mock:deadLetterChannel") > >> private MockEndpoint mockDeadLetterChannel; > >> > >> @Test > >> public void directVmShallNotChangeUnitOfWork() throws Exception { > >> final String originalBody = "original body"; > >> mockDeadLetterChannel.expectedMessageCount(1); > >> mockDeadLetterChannel.expectedBodiesReceived(originalBody); > >> template.sendBody("direct:start", originalBody); > >> assertMockEndpointsSatisfied(); > >> } > >> > >> private static class DirectVmRoute extends RouteBuilder { > >> public void configure() throws Exception { > >> > >> > errorHandler(deadLetterChannel("mock:deadLetterChannel").useOriginalMessage()); > >> from("direct:start").setBody(constant("modified > >> body")).to("direct-vm:next"); > >> from("direct-vm:next").throwException(new > RuntimeException()); > >> } > >> } > >> } > >> > >> > >> ------- > >> > >> If updating DirectVmProcessor.java in camel-core as shown below the > >> testcase passes. > >> > >> protected Exchange prepareExchange(Exchange exchange) { > >> // send a new copied exchange with new camel context (do not > >> handover completions) > >> Exchange newExchange = > >> ExchangeHelper.copyExchangeAndSetCamelContext(exchange, > >> endpoint.getCamelContext(), false); > >> // set the from endpoint > >> newExchange.setFromEndpoint(endpoint); > >> newExchange.setUnitOfWork(exchange.getUnitOfWork()); // <--- > >> Update. Copy UOW from original exchange > >> > >> return newExchange; > >> } > >> > >> > >> Thanks, > >> Karsten > > > > > > > > -- > > Christian Posta > > http://www.christianposta.com/blog > > twitter: @christianposta > > > > -- > Claus Ibsen > ----------------- > Red Hat, Inc. > Email: cib...@redhat.com > Twitter: davsclaus > Blog: http://davsclaus.com > Author of Camel in Action: http://www.manning.com/ibsen > Make your Camel applications look hawt, try: http://hawt.io >