Hi all again, I have investigated the behavior and I get to the conclusion that vm: does not support the option "multipleConsumers" between different contexts (on the same JVM). Could anyone please confirm if this is the expected behavior or if it is a bug?
thank you! Cristiano PS. Here are my clues and the code I have used to make the test: 1. if start multiple consumers on "seda:test" or "vm:test" on the same CamelContext I get a "Failed to start route route2 because of Multiple consumers for the same endpoint is not allowed" (Expected Behavior) 2. if start multiple consumers on "seda:test" from different CamelContext I get no errors but no message is exchanged (Expected Behavior) 3. if start multiple consumers on "vm:test" from different CamelContext get no errors, and only one consumer get the message (???? I don't if it is the desired behavior or if it should work as case 1 as vm: should see that there are multiple consumers for the same endpoint) 4. if start multiple consumers on "seda:test?multipleConsumers=true" or "vm:test?multipleConsumers=true" on the same CamelContext t works and each consumer get the message (Expected Behavior) 5. if start multiple consumers on "seda:test?multipleConsumers=true" using different CamelContext get no errors and again no message is exchanged (Expected Behavior as each camel context is independent) 6. if start multiple consumers on "vm:test?multipleConsumers=true" using different CamelContext I get no errors, but only one consumer get the message (Unexpected Behavior!!) Here the class I have used to make the test: package eu.protectrail.esb.camel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; public class CamelSedaVmTests { public static class TestConsumer { private final String id; private final CamelContext context; public TestConsumer(String id, CamelContext context) { this.id = id; this.context = context; }; public void registerRoutes(final String endpoint) throws Exception { context.addRoutes(new RouteBuilder() { @Override public void configure() { from(endpoint).process(new Processor() { @Override public void process(Exchange exchange) throws Exception { System.out.println(id + " has received " + exchange.getIn().getBody(String.class)); } }); } }); } } public static class TestProducer { private final CamelContext context; public TestProducer(CamelContext context) { this.context = context; }; public void produce(String body, String endpoint) { ProducerTemplate template = context.createProducerTemplate(); template.sendBody(endpoint, body); } } public static void main(String[] args) throws Exception { // NOTE: uncomment the endpoint to test and set shareContext value to // true to use the same camel context for all the routes // final String endpoint = "seda:test"; // final String endpoint = "vm:test"; // final String endpoint = "seda:test?multipleConsumers=true"; final String endpoint = "vm:test?multipleConsumers=true"; boolean shareContext = false; TestConsumer consumerOne; TestConsumer consumerTwo; TestProducer producer; if (!shareContext) { // Test using 3 different contexts for the 2 consumer and the producer DefaultCamelContext contextUno = new DefaultCamelContext(); DefaultCamelContext contextDue = new DefaultCamelContext(); DefaultCamelContext contextProducer = new DefaultCamelContext(); consumerOne = new TestConsumer("one", contextUno); consumerTwo = new TestConsumer("two", contextDue); producer = new TestProducer(contextProducer); contextUno.start(); contextDue.start(); contextProducer.start(); } else { // Test using the same contexts for consumer and producers DefaultCamelContext sameContext = new DefaultCamelContext(); consumerOne = new TestConsumer("one", sameContext); consumerTwo = new TestConsumer("two", sameContext); producer = new TestProducer(sameContext); sameContext.start(); } consumerOne.registerRoutes(endpoint); consumerTwo.registerRoutes(endpoint); Thread.sleep(1000); System.out.println("-- START --"); producer.produce("foo", endpoint); Thread.sleep(1000); producer.produce("bar", endpoint); Thread.sleep(1000); producer.produce("baz", endpoint); System.out.println("-- END --"); } } 2013/9/4 Cristiano Costantini <cristiano.costant...@gmail.com> > Hi All, > > I've switched and endpoint using seda: with options multipleConsumers=true > and waitForTaskToComplete=Never to using vm: component. > > After this, the application does not respect anymore the > multipleConsumers=true options and two concurrent consumer steal the > message. > > I may have other issue which I'm going to investigate, but to avoid waste > time I please ask you if I'm missing some detail by switching from seda: to > vm: (it is the first time I use vm: and I was expecting the same behavior > of the seda:endpoint) > > I'm using Camel 2.10.6 inside Servicemix 4.5.2. > > Thank you very much! > > Cristiano >