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());
}
}
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
The JMS component has built-in thread pooling, which scales very well up and down depending on number of message queing up.
So just use that
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());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With