【问题标题】:Camel Multi-threaded Consumer骆驼多线程消费者
【发布时间】:2015-08-27 18:51:31
【问题描述】:

我有一个包含订单的数据库,每个订单都有截止日期和创建日期。我想将最多 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 的更改。

有没有多线程生产者?

提前感谢您的建议!

【问题讨论】:

    标签: java multithreading apache-camel producer


    【解决方案1】:
    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可以帮助以更好的方式实现这个逻辑。

    【讨论】:

    • 谢谢,拆分会阻塞原来的定时器路由,直到4个订单全部完成?
    • 是的,如果 fixedRate 关闭。
    • 嗯,这些命令需要一段时间来处理(10-20 分钟),所以我想我会有几个线程空闲,直到定时器路由的下一次触发。我想保持这 4 个线程的持续使用。这就是我苦苦挣扎的地方。
    • 我使用了这个的变体,几乎可以到达我想要的地方,非常感谢!
    • 很酷的东西,也许这样的东西可以进入骆驼的“标准”。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    相关资源
    最近更新 更多