2017-05-11 15 views
0

私はparallell作業を行うためにsplit内のthreadPoolを使用するcamelRouteを持っています。私の問題は、私はは、分割が1つのスレッドを実行し、スレッドプールが指定された量のスレッドを実行するので、常に1つのスレッドで終わることです。私はスレッドプールのスレッドの量を上限にしたいと思います。Apache Camel splitはThreadPoolで並列実行されますが、なぜですか?

これはなぜ起こるのですか?ルートとのThreadPoolがそのように私のラクダのcontext.xmlのように構成されて

from(FROM_ENDPOINT) 
    .routeId(ID) 
    .split(body(), new GroupedExchangeAggregationStrategy()) 
    .executorServiceRef("ThreadPool") 
    .bean(bean, "beanMethod") 
    .end() 
    .bean(bean) 
    .multicast() 
    .to(TO_ENDPOINT); 

(ここからとIDなどのようなコードでは他の値、が、カントショー...)以下のラクダ、コンテキスト... :

<camel:camelContext id="application-context" useMDCLogging="true" xmlns="http://camel.apache.org/schema/spring"> 
    <propertyPlaceholder id="properties" location="ref:props"/> 
    <routeBuilder ref="refToRoute"/> 
    <threadPoolProfile id="ThreadPool" maxPoolSize="2" 
         maxQueueSize="-1" poolSize="2"/> 
</camel:camelContext> 

答えて

3

スプリッターは、並列作業を調整するために1つのバックグラウンドスレッドが必要です。だから、あなたはスレッドプールのスレッドと、名前がSplitter-AggregateTaskの余分なスレッドが1つあります。

合計の最大値を10にしたい場合は、スレッドプールサイズを9に設定します。そのため、その1バックグラウンドスレッドのための空き領域も確保されます。

+0

ありがとう、私は余分なスレッドがある理由を知っています。スレッドプールの値を1に設定することを考えましたが、1スレッドで実行したいのですが?テストでは、私たちが順番に参照する必要があるスレッドプールログの値で実行している作業として1つのスレッドのみを使用すると有益です。これにより、並列フローはこれを非常に難しくします。今私が唯一の解決策は、ルートからスレッドプールを削除することです。 – pressbyron

+0

1スレッドの場合、スレッドプールを使用せず、そのすべてを同じ順序で同じ順序で使用します。 –

+0

はい、私は理解していますが、本番環境ではスレッドプールを持っていますが、デバッグのためにテストには入っていません。私はtest/prodのための2つのコードベースを必要としませんが、私はちょうどテストで1つのスレッドを使用するようにスレッドプールを設定したいと思っています。しかし、これは不可能かもしれませんか? – pressbyron

関連する問題