Camel多线程消费者

rrh*_*tjr 2 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();
Run Code Online (Sandbox Code Playgroud)

DAO函数getNextOrder按创建日期返回最旧的订单,该订单已超过其到期日期。立即尝试收到的订单。

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

我有什么想法可以构建这些路由,以便轮询数据库以查找最旧的 4 个订单并同时执行这些订单?对 DAO 的更改是可以接受的。

有没有一种多线程生产者?

预先感谢您的建议!

Dra*_*vic 5

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();
Run Code Online (Sandbox Code Playgroud)

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

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