寻找并发交换作为apache camel splitter的输入

时间:2014-04-16 20:50:40

标签: multithreading parallel-processing apache-camel splitter

我正在实现一个从数据库读取行的路由,使用拆分器拆分它们,并行处理它们并聚合和更新数据库。当分路器路径只有一个输入时,一切都按预期工作。示例代码 -

    <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>

当我向直接发送3条消息时:拆分器(每个消息需要几分钟才能完成处理)并让它们全部并行处理。当我尝试这个时,立即打印所有3个输入的分配器外的第一个日志消息。但是,来自内部拆分器的日志消息表明3个交换中的每一个都是一个接一个地拆分。每个子消息都使用线程池。有没有办法让拆分器并行拆分3个输入交换?

2 个答案:

答案 0 :(得分:0)

是的,使用seda路线或vm路线。这些都做同样的事情,但用途略有不同。我建议你看看我对这些差异的回答:camel splitter parallel processing

您遇到的问题是您希望将消息并行发送到拆分器。因此,消息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>

请注意,消息将处理到seda组件路径,其中MESSAGE以并行方式处理。您可以通过在分割器中包含parallelProcessing="true"来使此更加平行,以便并行处理拆分中的各个项目。

如果您需要更多信息,请大声说。

答案 1 :(得分:0)

检查线程池中至少有6个线程可用,名为myPool