More info:

I see that VmComponent implementation simply extends the SedaEndpoint and
instead of using its queues:

    private final Map<String, QueueReference> queues = new HashMap<String,
QueueReference>();

uses a static map:

    protected static final Map<String, QueueReference> QUEUES = new
HashMap<String, QueueReference>();


well, this is ok and smart, but it happen that when you get the consumers
in SedaEndpoint

    public Set<SedaConsumer> getConsumers() {
        return new HashSet<SedaConsumer>(consumers);
    }

it does not returns all the consumers from any camel context.
In my previous example when I was using 1 producer in one context and 2
consumers in two other different contexts, the getConsumers() was returning
a set with only one consumer.

Now I'm starting thinking that this is a bug ;-)

Cristiano




2013/9/4 Cristiano Costantini <cristiano.costant...@gmail.com>

> 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
>>
>
>

Reply via email to