Multithreading 寻找并发交换作为apache camel splitter的输入
我正在实现一种从数据库中读取行、使用拆分器拆分行、并行处理行以及聚合和更新数据库的路由。当只有一个到拆分器路由的输入时,一切都按预期工作。示例代码-Multithreading 寻找并发交换作为apache camel splitter的输入,multithreading,parallel-processing,apache-camel,splitter,Multithreading,Parallel Processing,Apache Camel,Splitter,我正在实现一种从数据库中读取行、使用拆分器拆分行、并行处理行以及聚合和更新数据库的路由。当只有一个到拆分器路由的输入时,一切都按预期工作。示例代码- <route> <from uri="direct:splitter"/> <log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}" /
<route>
<from uri="direct:splitter"/>
<log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}" />
<split strategyRef="aggregatorStrategy" executorServiceRef="myPool">
<simple>${body}</simple>
<log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}, split index - $simple{property.CamelSplitIndex}" />
<to uri="bean:gisResponseProcessor" />
</split>
</route>
${body}
当我向direct:splitter发送3条消息时(每一条消息都需要几分钟来完成处理),并让它们并行处理。当我尝试此操作时,所有3个输入的拆分器外的第一条日志消息会立即打印出来。但是,来自splitter内部的日志消息表明,3个交换机中的每一个都被逐个拆分。每个子消息都使用线程池。有没有办法使拆分器并行拆分3个输入交换?是,使用
seda
路由或vm
路由。两者的作用相同,但用途略有不同。我建议你看看我关于差异的回答:
您面临的问题是希望将消息并行发送到拆分器。因此,并行处理消息1、2和3。这可以通过使用seda
组件来实现。seda
组件是异步的,允许您并行处理路由上的消息
尝试以下路线:
<route>
<from uri="direct:splitter"/>
<log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}" />
<to uri="seda:sedaSplitter"/>
</route>
<route id="sedaSplitter>
<from uri="seda:sedaSplitter?multipleConsumers=true&concurrentConsumers=16"/>
<split strategyRef="aggregatorStrategy" executorServiceRef="myPool">
<simple>${body}</simple>
<log message="batch id- $simple{header.BATCH_NUMBER}, loop index - $simple{property.CamelLoopIndex}, split index - $simple{property.CamelSplitIndex}" />
<to uri="bean:gisResponseProcessor" />
</split>
</route>
检查在名为myPool
的线程池中至少有6个线程可用,当设置executorServiceRef
时,将自动暗示并行处理,并且您不必启用该选项。我尝试了您建议的路由,但仍然看到类似的日志消息。我似乎在分裂之前是平行的。拆分器一次只处理一个输入交换(拆分为并行处理的多个子消息)。我是否需要配置多个路由(如sedaSplitter)以获得对splitter的多个输入的并行消耗?此池是否与其他路由共享?而不是共享池。我将用一个完整的驼峰配置更新这个问题,这样它就更清楚了。