camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Christian Posta <christian.po...@gmail.com>
Subject Re: useOriginalMessage with direct-vm
Date Fri, 28 Feb 2014 00:01:13 GMT
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 <kmgvileid@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

Mime
View raw message