消息排序和并行处理apache camel

时间:2018-05-05 21:35:53

标签: parallel-processing apache-camel

我想处理一个自定义java对象列表,使用camel splitter分割它们,并喜欢在并行线程中处理它们。但我面临的挑战是,自定义对象列表是根据Id进行排序的,必须将其写入文件中。

一旦我使用并行处理,序列就会受到干扰。我经历了一些要求使用“resequencer”或“single thread”的文章。 但是使用单线程,处理5k记录需要花费大量时间。

任何线索都非常有帮助。 谢谢 尼丁

2 个答案:

答案 0 :(得分:4)

基于标签“ XXX”拆分XMl请求时,我遇到了类似的问题。然后处理拆分后的请求并汇总为响应。 汇总响应的顺序与请求的顺序不同。

FIX:该问题已通过在拆分器EIP中使用聚合“ strategyRef”解决。

示例代码:

    <route>
        <from id="_from1" uri="activemq:DocumentGenerationQueue" />
        <split  parallelProcessing="true" streaming="false"  strategyRef = "AggregateTask" >
        <tokenize token="XXX" xml="true" />
            <to id="_to71"  uri="bean:ProcessorBean" />
            <to id="_to72"  uri="activemq:SplittedResponseQueue" />
        </split>
        <to uri="activemq:AggregatedResponseQueue" />
    </route>

答案 1 :(得分:0)

您可以创建一个AggregationStrategy实例,以比较newExchangeoldExchange的结果,并创建一个resultExchange,其中包含基于id的自定义Java对象的排序列表。

  

但是使用单线程,需要花费大量时间来处理5k记录。

您必须小心,因为您可能不想启动5k并行线程,而是创建自己的线程池,并使用executorServiceRef将其附加到拆分中。这样,您可以控制线程数并处理队列已满时该怎么办。