我们需要同时处理多个任务,并且每个任务都需要将近10秒才能完成处理。我们的骆驼路线看起来像这样。
<route id="routeA">
<from uri="activemq:queue:queueA" />
<to uri="direct-vm:genericProcessing" />
</route>
<routeid="routeB">
<from uri="activemq:queue:queueB" />
<to uri="direct-vm:genericProcessing" />
</route>
<route id="routeC">
<from uri="direct-vm:genericProcessing" />
<!--Run business rules -->
<inOnly uri="vm:timeTakingRoute" /> <!-- this takes 10 sec to complete />
</route>
从vm:timeTakingRoute请求应该在单个线程中运行,因为它需要数据库事务。如果我们使用inOnly交换模式与vm端点,请求异步运行但是请求至少需要10秒才能完全从这里处理,其他请求可能会堆积直到第一个请求完成。我们如何生成线程以同时运行请求。我可以考虑的可能选项是在vm上使用concurrentconsumers选项,用并发消费者定义的activemq替换vm,用自定义线程池替换vm和wiretap,或者如下定义?
<threads>
<to uri="vm:timeTakingRoute" />
</threads>
解决此问题的最佳选择是什么?
答案 0 :(得分:0)
通常我只是使用maxConcurrentConsumers属性来增加从队列中读取的消费者线程...这个多线程下游处理
<route id="routeA">
<from uri="activemq:queue:queueA?maxConcurrentConsumers=10" />
<to uri="direct-vm:genericProcessing" />
</route>
其他选项
使用async API进行内部操作,不会阻止客户端调用
在vm组件上使用concurrentConsumers(如您所建议的那样)
添加另一个队列跃点以解耦/多线程(seda,activemq)一个下游的in-only进程