2013-11-14 3 views
3

Я потратил почти два дня, чтобы понять концепцию concurrentConsumers против потоков в верблюде apache. но я действительно не понимаю эту концепцию. может кто-нибудь помочь мне понять эту концепцию. Я использую верблюд 2.12.0.Apache Camel concurrentConsumers vs threads

from("jms:queue:start?concureentConsumers=5") 
    .threads(3, 3, "replyThread") 
    .bean(new SomeBean()); 

    pom.xml 
    ========================================== 
    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <camel.version>2.12.0</camel.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.1</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- required by both client and server --> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-core</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-spring</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jms</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-test</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-activemq</artifactId> 
     <version>1.1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-test-spring</artifactId> 
     <version>2.12.1</version> 
    </dependency> 
</dependencies> 


    //posting to queue 
    for (int i = 0; i < 10; i++) { 
     System.out.println(Thread.currentThread() + " sending request..." + i); 
     template.asyncCallbackRequestBody("jms:queue:start", (body + " " + i), callback); 
    } 

    //my call back 
    public class MyCallback extends SynchronizationAdapter { 

    @Override 
    public void onComplete(Exchange exchange) { 
     String body = exchange.getOut().getBody(String.class); 
     System.out.println(Thread.currentThread() + " Callback Resposne..." +body); 
} 
} 

    public static class SomeBean { 
    public void someMethod(Exchange body) { 
     System.out.println(Thread.currentThread() + " Received: " + body.getIn().getBody()); 
     body.getOut().setBody(body.getIn().getBody()); 
    } 
} 

мое понимание (от апача документации верблюд), там будет 5 конкурирующих потребителей на JMS: старт очереди, чтобы получать сообщения. и 3 «replyThreads» для обработки ответов Async из jms: start queue. но выход на выходе - это нечто другое.

 Thread[main,5,main] sending request...0 
    Thread[main,5,main] sending request...1 
    Thread[Camel (camel-1) thread #9 - replyThread,5,main] Received: Hello Camel 0 
    Thread[Camel (camel-1) thread #10 - replyThread,5,main] Received: Hello Camel 1 
    Thread[Camel (camel-1) thread #5 - ProducerTemplate,5,main] Callback Resposne...Hello Camel 0 
    Thread[Camel (camel-1) thread #6 - ProducerTemplate,5,main] Callback Resposne...Hello Camel 1 

ответ

0

Если вы хотите проверить пул потоков JMS, вам необходимо изменить маршрут, как этот

from("jms:queue:start?concurrentConsumers=5") 
    .bean(new SomeBean()) 
    .threads(3, 3, "replyThread") 
    .bean(new SomeBean()); 

SomeBean может показать вам, что различные пулы потоков используются в маршруте верблюд.

+0

Вы действительно не нужно, что второй пул потоков, просто использовать пул потоков из JMS, что прекрасно работает. –

+0

Ах, просто посмотрите немного дальше. Как сказано в Camel 2.10.3, вам больше не нужны потоки(). –

3

Компонент JMS имеет встроенный пул потоков, который очень хорошо масштабируется вверх и вниз в зависимости от количества сообщений.

Так просто использовать, что

from("jms:queue:start?concurrentConsumers=5") 
    .bean(new SomeBean()); 

Вы можете указать максимальное и так существует целый ряд

from("jms:queue:start?concurrentConsumers=5&maxConcurrentConsumers=10") 
    .bean(new SomeBean()); 
+0

Спасибо за быстрый ответ. я запутался, когда прочитал эту документацию по http://camel.apache.org/jms.html @ Раздел «Запрос-ответ по JMS» , где он упомянул .threads (5), нужно определить, хотим ли мы обрабатывать Async ответы. – Ramki

Смежные вопросы