[ https://issues.apache.org/jira/browse/CAMEL-8393?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-8393. -------------------------------- Resolution: Fixed Thanks for reporting > Redelivery doesn't work correctly on Dynamic Routers > ---------------------------------------------------- > > Key: CAMEL-8393 > URL: https://issues.apache.org/jira/browse/CAMEL-8393 > Project: Camel > Issue Type: Bug > Components: camel-core > Affects Versions: 2.14.1 > Environment: mac > Reporter: Minh Tran > Assignee: Claus Ibsen > Fix For: 2.16.0 > > > When redelivery occurs for dynamic routers, the properties are being kept. So > if the dynamic router uses a property to store the current state such as used > in example http://camel.apache.org/dynamic-router.html , then the redelivery > actually ends up skipping the endpoint that caused the exception > Here is my dynamic router class > {noformat} > public class Router { > public String route(Exchange exchange) { > Boolean invoked = exchange.getProperty("invoked", > Boolean.class); > if (invoked == null) { > exchange.setProperty("invoked", true); > return "mock:route"; > } else > return null; > } > } > {noformat} > Here is my unit test class > {noformat} > @RunWith(CamelSpringJUnit4ClassRunner.class) > @ContextConfiguration(loader = CamelSpringDelegatingTestContextLoader.class) > public class DynamicRouterTest { > @Produce(uri = "direct:start") > private ProducerTemplate producerTemplate; > @EndpointInject(uri = "mock:end") > private MockEndpoint end; > @EndpointInject(uri = "mock:route") > private MockEndpoint route; > @Configuration > public static class JavaConfig extends SingleRouteCamelConfiguration { > @Override > public RouteBuilder route() { > return new SpringRouteBuilder() { > @Override > public void configure() throws Exception { > this.getContext().setTracing(true); > > from("direct:start").onException(IOException.class).maximumRedeliveries(-1).end() > > .dynamicRouter().method(Router.class).to("mock:end"); > } > }; > } > } > @Test > public void test() throws InterruptedException { > route.whenAnyExchangeReceived(new Processor() { > @Override > public void process(Exchange exchange) throws Exception > { > exchange.getIn().setBody("mock route"); > } > }); > route.expectedBodiesReceived("before"); > end.expectedBodiesReceived("mock route"); > producerTemplate.sendBody("before"); > route.assertIsSatisfied(); > end.assertIsSatisfied(); > } > @Test > public void test_exception() throws InterruptedException { > route.whenExchangeReceived(1, new Processor() { > @Override > public void process(Exchange exchange) throws Exception > { > exchange.setException(new IOException()); > } > }); > route.whenExchangeReceived(2, new Processor() { > @Override > public void process(Exchange exchange) throws Exception > { > exchange.getIn().setBody("mock route"); > } > }); > // this bit fails > route.expectedBodiesReceived("before", "before"); > end.expectedBodiesReceived("mock route"); > producerTemplate.sendBody("before"); > route.assertIsSatisfied(); > end.assertIsSatisfied(); > } > } > {noformat} > The test method runs successfully but the test_exception method which tests > the redelivery does not. Fails with "java.lang.AssertionError: mock://route > Received message count. Expected: <2> but was: <1>" which shows that the > dynamic router only called the mock:route once. > -- This message was sent by Atlassian JIRA (v6.3.4#6332)