2017-01-20 9 views
1

スプリットと集約機能を持つCamelでルートを定義しましたが、集約後に例外をスプリットに戻すことはできません。Apache Camel分割と集約の例外処理

counter.incrementAndGet(); //atomic counter 
if(counter.get()==3) 
    { 
    exchange.setException(new RuntimeException()); 
    throw new RuntimeCamelException(); 
    } 

しかし:実行するためのスプリットだ下記我々は例外が発生した場合でも、

上記のコードから

from("direct:MyRoute") 
    .routeId("MyRouteID") 
     .split().tokenize("\n", 1) 
     .streaming().stopOnException() 
     .choice() 
     .when(simple("${property.CamelSplitIndex} > 0")) 
      .unmarshal(domainDataFormat) 
      .choice() 
      .when(simple("${property.CamelSplitComplete}")) 
      .process(
       new Processor() 
       { 
       @Override 
       public void process(Exchange exchange) throws Exception 
       { 
        exchange.getIn().getHeaders().put(Exchange.AGGREGATION_COMPLETE_ALL_GROUPS_INCLUSIVE, true); 
       } 
       } 
      ) 
      .end() 
      .aggregate(myAggregationStrategy).constant(true) //if i comment this line split will be stop on exception 
      .threads().executorService(executorService) 
      .process(myProcessor).end() 
    .end(); 

プロセッサ(myProcessor)が動作していないコードは以下の通りですされている原因、私はルートから集約を削除する瞬間、スプリットは例外のルートを停止することができます。

答えて

1

同じ作業単位内で分割+集約(フォーク/結合)する複合メッセージ・プロセッサEIPを使用します。

はでドキュメントを参照してください:http://camel.apache.org/composed-message-processor.html

そして、あなたはそれが一緒に仕事持ってスプリッタに集約戦略を指定することができますスプリッタのみセクションを参照してください。

+0

感謝のClaus、応答します。 を確認して、集約コールの前に.streamingと.unmarshalを使用していることを確認できます。 スプリット+アグリゲートではこれを実行できません。そこに他の方法がありますか? –

+0

あなたはそれを続けることができます、単に集約を削除し、分割戦略を追加すると、あなたは分割完了をチェックするためのロジックは必要ありません。キャメル・イン・アクション(Camel in Action)の本を読んだらこれらのパターンについてもっと詳しく知っていれば、 –

+0

こんにちはクラウス、ここで私たちの要求にどのように使っているのか説明しましょう。 上記で説明したルートを使用して巨大なフラット固定長ファイルを処理しているので、一般的なフローはファイルごとに分割され、ストリームされ、次に非整列化されてPOJOが得られます(bindyを使用) (マルチスレッド) しかし、これはスプリット+アグリゲートでは不可能です。これは、アグリゲートとスプリットの前に非整列化とストリーミングを行うのに役立ちません。 –

関連する問題