Concurrent consumers on seda endpoint can cause content routing to mismatch
---------------------------------------------------------------------------

                 Key: CAMEL-3188
                 URL: https://issues.apache.org/activemq/browse/CAMEL-3188
             Project: Apache Camel
          Issue Type: Bug
          Components: camel-core
    Affects Versions: 2.4.0
         Environment: Mac OS X 10.6.4
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
            Reporter: Brian Feaver


When consuming concurrently from a seda endpoint, when the route contains a 
content router based on the header, it will randomly route through the wrong 
choice.

In my specific case, I was consuming from an activemq queue, which would 
receive messages with a header that would then determine which route it would 
follow. It would randomly send messages down the wrong path. When I turned on 
tracing, it would behave itself. It also behaved itself when I limited it to 
only a single consumer. I was, however, able to duplicate it with the unit test 
below. Due to the concurrency issue, the test can occasionally pass, but run it 
a couple times and it should fail. It'll either receive 2 messages when it 
should have only gotten 1, or it will get no messages when it should have 
gotten 1.

{code:title=ConcurrencyTest.java|borderStyle=solid}
import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.CamelTestSupport;

public class ConcurrencyTest extends CamelTestSupport {

        @EndpointInject(uri = "mock:result")
        protected MockEndpoint resultEndpoint;
        
        @EndpointInject(uri = "mock:otherResult")
        protected MockEndpoint otherResultEndpoint;

        @Produce(uri = "seda:start")
        protected ProducerTemplate template;

        public void testSendMatchingMessage() throws Exception {
                String expectedBody = "<matched/>";
                
                resultEndpoint.expectedBodiesReceived(expectedBody);
                otherResultEndpoint.expectedBodiesReceived(expectedBody);

                template.sendBodyAndHeader(expectedBody, "myDirection", "send");
                template.sendBodyAndHeader(expectedBody, "myDirection", 
"received");

                resultEndpoint.assertIsSatisfied();
        }

        @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("seda:start?concurrentConsumers=10")
//                from("seda:start?concurrentConsumers=1")
                        .choice()
                                
.when(header("myDirection").isEqualTo("send")).to("mock:result")
                                
.when(header("myDirection").isEqualTo("received")).to("mock:otherResult");
            }
        };
    }
}
{code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to