java – 在camel中使用队列的线程DSL行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在camel中使用队列的线程DSL行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2383字,纯文字阅读大概需要4分钟。
内容图文
![java – 在camel中使用队列的线程DSL行为](/upload/InfoBanner/zyjiaocheng/795/e60e94e3092a4ff6b5d20021603f6179.jpg)
在下面的路由中,我期望来自queue1的10 msg应该同时进行处理,但是一次只有一个进程.
我错了吗?或做错了什么?
context.addRoutes(new RouteBuilder() {
public void configure() {
from("test-jms:queue:test.queue1").threads(10)
.process(sleep(1)); // sleep id is 1
}
private Processor sleep(final int sleepId) {
return new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println(curTime() + " Going for sleep sleepid=" + sleepId );
Thread.sleep(5000l);
System.out.println(curTime() + " Done sleep sleepid=" + sleepId );
}
};
}
使用以下方式呼叫上述路线:
ExecutorService ec = Executors.newFixedThreadPool(5);
ec.submit(new Task(context,template));
ec.submit(new Task(context,template));
ec.submit(new Task(context,template));
ec.submit(new Task(context,template));
ec.submit(new Task(context,template));
static class Task implements Runnable{
CamelContext context;
ProducerTemplate template;
public Task(CamelContext context, ProducerTemplate template) {
super();
this.context = context;
this.template = template;
}
@Override
public void run() {
Exchange exchange = new DefaultExchange(context);
exchange.setPattern(ExchangePattern.InOnly);
exchange.getIn().setBody("Test Message: " + Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName());
Exchange send = template.send("test-jms:queue:test.queue1",exchange);
System.out.println("completed");
}
}
来自代码的OutPut:
10:24:11 Going for sleep sleepid=1
10:24:16 Done sleep sleepid=1
10:24:16 Going for sleep sleepid=1
10:24:21 Done sleep sleepid=1
10:24:21 Going for sleep sleepid=1
10:24:26 Done sleep sleepid=1
10:24:26 Going for sleep sleepid=1
10:24:31 Done sleep sleepid=1
10:24:31 Going for sleep sleepid=1
10:24:36 Done sleep sleepid=1
如果我们观察时间戳,我们将看到该路由仅处理1 msg.
解决方法:
您需要在JMS端点上启用asyncConsumer以允许它为异步.执行此操作时,可以不按顺序处理从队列中消耗的消息,从而默认情况下订购消费者的原因.
代码应该是
public void configure() {
from("test-jms:queue:test.queue1?asyncConsumer=true").threads(10)
.process(sleep(1)); // sleep id is 1
}
但是JMS组件具有内置并发性,通常可以更好地使用,因为它可以使用并发JMS使用者和并发网络.有关更多详细信息,请参阅concurrentConsumers和maxConcurrentConsumers选项.
内容总结
以上是互联网集市为您收集整理的java – 在camel中使用队列的线程DSL行为全部内容,希望文章能够帮你解决java – 在camel中使用队列的线程DSL行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。