【问题标题】:Asynchronously processing tasks with concurrent processing用并发处理异步处理任务
【发布时间】:2015-07-18 22:06:06
【问题描述】:

我们需要同时处理多个任务,每个任务需要将近 10 秒才能完成处理。我们的骆驼路线是这样的。

<route id="routeA">
<from uri="activemq:queue:queueA" />
<to uri="direct-vm:genericProcessing" />
</route>

<routeid="routeB">
<from uri="activemq:queue:queueB" />
<to uri="direct-vm:genericProcessing" />
</route>

<route id="routeC">
<from uri="direct-vm:genericProcessing" />
<!--Run business rules -->
<inOnly uri="vm:timeTakingRoute" /> <!-- this takes 10 sec  to complete />
</route>

来自 vm:timeTakingRoute 的请求应该在单线程中运行,因为它需要 DB 事务。如果我们使用带有 vm 端点的 inOnly 交换模式,请求会异步运行,但由于从这里完全处理请求至少需要 10 秒,其他请求可能会堆积直到第一个请求完成。我们如何产生线程来同时运行请求。我能想到的可能选项是在 vm 上使用 concurrentconsumers 选项,用定义了并发消费者的 activemq 替换 vm,用自定义线程池替换 vm 或者定义如下?

<threads>
   <to uri="vm:timeTakingRoute" />
</threads>

解决此问题的最佳选择是什么?

【问题讨论】:

    标签: java apache-camel fuseesb jbossfuse


    【解决方案1】:

    通常我只是使用 maxConcurrentConsumers 属性增加从队列中读取的消费者线程...这会多线程处理下游处理

    <route id="routeA">
        <from uri="activemq:queue:queueA?maxConcurrentConsumers=10" />
        <to uri="direct-vm:genericProcessing" />
    </route>
    

    其他选项

    • 使用async API 进行 inonly 操作,以免阻塞客户端调用

    • 在 vm 组件上使用 concurrentConsumers(按照您的建议)

    • 添加另一个队列跃点以解耦/多线程(seda、activemq)下游in-only 进程

    【讨论】:

    • 我们已经为队列定义了 maxConcurrentConsumers。我要问的是 vm:timeTakingRoute。如何扩大规模???
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多