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&amp;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的多个输入的并行消耗?此池是否与其他路由共享?而不是共享池。我将用一个完整的驼峰配置更新这个问题,这样它就更清楚了。