我有一个包含订单的数据库,每个订单都有截止日期和创建日期。我想最多将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的更改是可以接受的。
是否有任何类型的多线程制作人?
提前感谢您的建议!
答案 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可以帮助以更好的方式实现这个逻辑。