You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@camel.apache.org by "Brian Feaver (JIRA)" <ji...@apache.org> on 2010/10/01 22:21:40 UTC

[jira] Created: (CAMEL-3188) Concurrent consumers on seda endpoint can cause content routing to mismatch

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.


[jira] Commented: (CAMEL-3188) Concurrent consumers on seda endpoint can cause content routing to mismatch

Posted by "Claus Ibsen (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/activemq/browse/CAMEL-3188?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=62279#action_62279 ] 

Claus Ibsen commented on CAMEL-3188:
------------------------------------

The problem actually seems to be the isEqualTo predicate.

The CBR is okay.

> 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
>            Assignee: Claus Ibsen
>
> 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.


[jira] Assigned: (CAMEL-3188) Concurrent consumers on seda endpoint can cause content routing to mismatch

Posted by "Claus Ibsen (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/CAMEL-3188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen reassigned CAMEL-3188:
----------------------------------

    Assignee: Claus Ibsen

> 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
>            Assignee: Claus Ibsen
>
> 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.


[jira] Updated: (CAMEL-3188) Concurrent consumers on seda endpoint can cause content routing to mismatch

Posted by "Claus Ibsen (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/CAMEL-3188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-3188:
-------------------------------

    Affects Version/s: 2.3.0

CAMEL-2651 is the culprit.

> 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.3.0, 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
>            Assignee: Claus Ibsen
>
> 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.


[jira] Resolved: (CAMEL-3188) Concurrent consumers on seda endpoint can cause content routing to mismatch

Posted by "Claus Ibsen (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/CAMEL-3188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen resolved CAMEL-3188.
--------------------------------

    Fix Version/s: 2.5.0
       Resolution: Fixed

trunk: 1003810.

> 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.3.0, 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
>            Assignee: Claus Ibsen
>             Fix For: 2.5.0
>
>
> 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.