Camel多线程消费者

时间:2015-06-11 21:14:53

标签: java multithreading apache-camel producer

我有一个包含订单的数据库,每个订单都有截止日期和创建日期。我想最多将4个订单拉入路线并同时处理它们。每个订单可能需要10-20分钟才能完成。但我希望尽可能保持所有线程的运行,不要有任何停机时间。

以下是我现在所拥有的:

from("timer://GetOrder?fixedRate=true&period=1s")
            .to("bean:orderInfoDao?method=getNextOrder")
            .to("jms://process-orders")
            .end();

from("jms://process-orders?concurrentConsumers=4")
            .to("bean:orderService?method=processOrder(${body})")
            .to("direct:send-result")
            .end();

getNextOrder DAO函数按创建日期返回最早的订单,该日期已超过截止日期。立即尝试接收订单。

现在,问题是由于计时器而传入的订单在JMS路由中堆积,当getNextOrder返回更旧的订单时,它在队列中落后。

我是如何构建这些路由以便DB轮询最早的4个订单并同时执行的?对DAO的更改是可以接受的。

是否有任何类型的多线程制作人?

提前感谢您的建议!

1 个答案:

答案 0 :(得分:4)

final Semaphore semaphore = new Semaphore(4); 

from("timer://GetOrder?period=1s")
            .to("bean:orderInfoDao?method=getNextOrder")
            .to("jms://process-orders")
            .process(new Processor() {
                 public void process(Exchange exchange) {
                     semaphore.acquire();
                 }
             })
            .end();

from("jms://process-orders?concurrentConsumers=4")
            .to("bean:orderService?method=processOrder(${body})")
            .process(new Processor() {
                 public void process(Exchange exchange) {
                     semaphore.release();
                 }
             })
            .to("direct:send-result")
            .end();

请注意,计时器fixedRate已关闭(默认)。

这是我想到的第一个想法,我希望有一些Camel EIP可以帮助以更好的方式实现这个逻辑。