Apache Camel 并发消费者与线程 [英] Apache Camel concurrentConsumers vs threads

查看:26
本文介绍了Apache Camel 并发消费者与线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了将近两天的时间来了解 Apache Camel 中的 concurrentConsumers 与线程的概念.但我真的不明白这个概念.谁能帮我理解这个概念.我正在使用骆驼 2.12.0.

i spent almost two days to understand the concept concurrentConsumers vs threads in Apache Camel. but i really don't understand the concept. could anyone help me to understand the concept. I am using camel 2.12.0.

   from("jms:queue:start?concurrentConsumers=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());
    }
}

我的理解(来自 apache camel 文档)是 jms:start 队列上将有 5 个竞争消费者来消费消息.和 3 个replyThreads"来处理来自 jms:start 队列的异步回复.但实际输出是不同的.

my understanding(from apache camel documentation) is there will 5 competing consumers on jms:start queue to consume messages. and 3 "replyThreads" to process Async replies from jms:start queue. but actuall output is something different.

     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

推荐答案

JMS 组件具有内置线程池,可根据消息队列的数量很好地上下扩展.

The JMS component has built-in thread pooling, which scales very well up and down depending on number of message queing up.

所以就用那个

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

您也可以指定一个最大值,以便有一个范围

You can specify a max also so there is a range

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

这篇关于Apache Camel 并发消费者与线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆