0

Apache CamelのonCompletion()イベントのドキュメントによると、交換のコピーがそこで使用され、処理は別のスレッドで実行されます。どうやらこれは、プロセッサでいくつかの交換プロパティを設定しているため、EventNotifierSupportを使用する場合にも当てはまります。その後、次のようなメソッドがあります。

public void notify(EventObject event) throws Exception {

    if (event instanceof ExchangeCompletedEvent) {
    //..get exchange properties and print them using event.getExchange()
    }
}

プロセッサで設定したプロパティは、DSLでonComplete()を使用しているときに使用できるのと同じように、この「完了イベント」では使用できないようです。

ルートの他のプロセッサで設定/変更されたプロパティを確実に取得できるように、交換の見かけのコピーにマージするにはどうすればよいですか?

ありがとう

デレク

4

1 に答える 1

0

実際には、交換に参加するプロセッサに追加されたプロパティは、これらのコールバックの両方、つまりinonCompletion()とで利用できますEventNotifierSupport#notify()

この動作を示す最小限の例は、に次の EventNotifierSupportコールバックを登録することで再現できますCamelContext

// Create listener
EventNotifierSupport eventNotifierSupport = new EventNotifierSupport(){

  @Override
  public void notify(EventObject event) throws Exception {
    if (event instanceof ExchangeCompletedEvent) {
      assert ((ExchangeCompletedEvent) event).getExchange().getProperties().containsKey("ADDED");
    }
  }

...

}

// Register listener in CamelContext
CamelContext camelContext = new DefaultCamelContext();
camelContext.getManagementStrategy().addEventNotifier(eventNotifierSupport);

送信されたメッセージにプロパティを設定するプロセッサを使用してルートを作成する場合...

camelContext.addRoutes(new RouteBuilder() {

  @Override
  public void configure() throws Exception {
    from("direct:start").process(new Processor() {
      @Override
      public void process(Exchange exchange) throws Exception {
        exchange.getProperties().put("ADDED","ADDED");
      }
    });
  }

});
camelContext.start();
camelContext.createProducerTemplate().sendBody("direct:start", "addPropertyToMe");

...リスナーのアサーションが常に通過することがわかります。これは、トランザクションが完了した後(つまり、交換が変更された後)に交換のコピーがリスナーに送信されるというCamelのドキュメントと一致しています。

あなたの問題は他の場所にあります。プロパティがプロセッサで設定されているが、コールバックで欠落している場合の最小限の例を提供していただければ、お手伝いします。

于 2012-05-21T17:09:51.983 に答える