Java 驼峰多线程消费者

Java 驼峰多线程消费者,java,multithreading,apache-camel,producer,Java,Multithreading,Apache Camel,Producer,我有一个订单数据库,每个订单都有一个到期日和创建日期。我想拉到路线最多4个订单,并同时处理它们。处理每份订单可能需要10-20分钟。但是我想让所有线程尽可能多地运行,而不是有任何停机时间 以下是我现在拥有的: from("timer://GetOrder?fixedRate=true&period=1s") .to("bean:orderInfoDao?method=getNextOrder") .to("jms://process-ord

我有一个订单数据库,每个订单都有一个到期日和创建日期。我想拉到路线最多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
返回一个旧得多的订单时,它在队列中的位置就远远落后了

你知道我如何构造这些路由,以便对数据库进行轮询,查找最早的4个命令,并同时执行这些命令吗?对DAO的更改是可以接受的

有任何类型的多线程生产者吗

提前感谢您的建议

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
处于关闭状态(默认)

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

请注意,计时器
fixedRate
处于关闭状态(默认)


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

谢谢,拆分会阻止原始计时器路线,直到所有4个订单完成吗?是的,如果fixedRate关闭。嗯,这些订单需要一段时间来处理(10-20分钟),所以我想我会有几个线程空闲,直到计时器路由的下一个火。我想保持这4个线程的持续使用。这就是我正在努力解决的问题。我用了一个变体来达到我想要的目的,非常感谢!很酷的东西,也许像这样的东西可以进入驼峰“标准”。谢谢,拆分会阻止原来的计时器路径,直到所有4个订单都完成吗?是的,如果fixedRate关闭。嗯,这些订单需要一段时间来处理(10-20分钟),所以我想我会有几个线程空闲,直到下一次启动计时器路径。我想保持这4个线程的持续使用。这就是我正在努力解决的问题。我用了一个变体来达到我想要的目的,非常感谢!很酷的东西,也许像这样的东西可以成为骆驼的“标准”。