2016-04-06 4 views
0

を分割結果を送信:Apacheのキャメル - 私はCXFエンドポイントからの要求を処理し、JSONとして結果を返すべきルートを持っているCXFエンドポイントに

public class MyRoute extends RouteBuilder 
{ 

// ... Autowired: 
// msgRequestProcessor - converts json {string,string} to String of "\n" delimited json string: {string}\n{string} 
// RangeProcessor, SingleProcessor - create mongodb Criteria object from json string 
// msgTypeMapper - adds corresponding header "msg.type" 

@Override 
public void configure() 
{ 
    from("direct:list") 
      .process(msgRequestProcessor) 
      .split(body()) 
       .bean(msgTypeMapper.class) 
       .choice() 
        .when(header("msg.type").isEqualTo("single")) 
         .log("Go to direct:single") 
         .to("direct:single") 
        .otherwise() 
         .log("Go to direct:range") 
         .to("direct:daterange") 
      .end() 
      .to("direct:aggregate"); 

    from("direct:range") 
      .process(new RangeProcessor()); 

    from("direct:single") 
      .process(new SingleProcessor()); 

    from("direct:aggregate") 
      .aggregate(new MyAgg()).header("msg.collection").completionSize(2) 
      .log("RETVAL: ${body}") 
      .marshal().json(JsonLibrary.Gson).end(); 
} 

public static final class MyAgg implements AggregationStrategy { 
    @Override 
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) 
    { 
     if (oldExchange == null) { 
      return newExchange; 
     } 

     Criteria oldCriteria = oldExchange.getIn().getBody(Criteria.class); 
     Criteria newCriteria = newExchange.getIn().getBody(Criteria.class); 

     Criteria criteria = new Criteria(); 
     criteria.andOperator(oldCriteria, newCriteria); 
     oldExchange.getIn().setBody(criteria.getCriteriaObject().toString()); 

     return oldExchange; 
    } 
} 

}

すべてが正常に動作します、私は正しい集計結果を参照してくださいそして、集計ログ

で完了が、CXFエンドポイントは、常に(分割前)msgRequestProcessorの出力を返します。

{"string"} 
{"string"} 

私はCriteriaオブジェクトが文字列に変換されることを期待していますが(ログに表示されます)

ご協力いただければ幸いです。ありがとう。

+0

あなたのルートにはCXFが関係していますか? – Ralf

+0

@Ralf直接のリクエストを転送するCXFリソースがあります。リストのエンドポイント。 – Savash

+1

デフォルトでは、スプリッタは元の交換を返します(http://camel.apache.org/splitter.html#Splitter-WhattheSplitterreturns)。したがって、CXFエンドポイントが元の要求を受信したことは驚くことではありません。驚くべきことに、集約コードには何も集約されていないということです。それは本当ですか? – Ralf

答えて

1

最初にインデントが誤っていることに注意してください。end()は実際にchoice()の最後であり、split()ではなく、

今、集計は機能しますが、実際に分割結果が入力メッセージであるため、その結果は破棄されます。要求/スプリッタ(でアウト)の使用を返信するために

、あなたは本当にsplit()as explained here(同じ誤解を招くインデント)と一緒に集約戦略を宣言する必要があります。

あなたが言及した公式ドキュメントでは、逆の状況です(唯一):スプリッタの結果は破棄され、集約の結果は下流にルーティングされます。

+0

ありがとう! はい、そこにポイントがあります。 split()に集計を追加し、split()を閉じるもう1つのend()を使用しています。集計内に集計を実装するにはどうすればいいですか?私はメッセージを別の方法で集約する必要があり、ここで相関IDを使用するオプションは表示されません... – Savash

関連する問題