我想处理一个自定义java对象列表,使用camel splitter分割它们,并喜欢在并行线程中处理它们。但我面临的挑战是,自定义对象列表是根据Id进行排序的,必须将其写入文件中。
一旦我使用并行处理,序列就会受到干扰。我经历了一些要求使用“resequencer”或“single thread”的文章。 但是使用单线程,处理5k记录需要花费大量时间。
任何线索都非常有帮助。 谢谢 尼丁
答案 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
实例,以比较newExchange
和oldExchange
的结果,并创建一个resultExchange
,其中包含基于id的自定义Java对象的排序列表。
但是使用单线程,需要花费大量时间来处理5k记录。
您必须小心,因为您可能不想启动5k并行线程,而是创建自己的线程池,并使用executorServiceRef
将其附加到拆分中。这样,您可以控制线程数并处理队列已满时该怎么办。