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