2016-04-18 13 views
2

入力ボディを生成するための最初のルート。キャメル使用オリジナルメッセージが機能しない

from("timer://bar?fixedRate=true&period=10000s") 
      .process(new Processor() { 
       @Override 
       public void process(Exchange exchange) throws Exception { 
        exchange.getIn().setBody("some message"); 
       } 
      }).to("direct:dummydata"); 

第2の経路の例外をスローし、onExceptionでそれをキャッチします。

onException(RuntimeException.class) 
      .useOriginalMessage() 
      .handled(true) 
      .log("after catching: ${body}"); 

    from("direct:dummydata") 
      .log("before exception: ${body}.") 
      .process(new Processor() { 
       @Override 
       public void process(Exchange exchange) throws Exception { 
        throw new RuntimeException("some exception"); 
       } 
      }); 

予想:いくつかのメッセージ:例外の前に 。キャッチ後の :メッセージ。

現実:

2016-04-18 18:08:02.342 INFO 5659 --- [0 - timer://bar] route2         : 
before exception: some message. 
2016-04-18 18:08:02.345 INFO 5659 --- [0 - timer://bar] route2         : 
after catching: 
2016-04-18 18:08:02.349 ERROR 5659 --- [0 - timer://bar] 
o.a.camel.processor.DefaultErrorHandler : Failed delivery for 
(MessageId: ID-sdcit001mac-49629-1460974079807-0-1 on ExchangeId: 
ID-sdcit001mac-49629-1460974079807-0-2). Exhausted after delivery attempt: 
1 caught: java.lang.RuntimeException: some exception. Processed by failure processor: 
FatalFallbackErrorHandler[Channel[Log(route2)[after catching: ${body}]]] 

useOriginalMessage()がここで働いていないのはなぜ?

答えて

3

問題は「直接」を使用しているように見えます。それを "direct:vm"に変更すると、必要な結果が表示されます。それは、このように(タイマーから)空の出発体を意味している、最初のルートから直接呼び出しているほとんどかのように扱われている:

おそらく根本的な理由は、「直接」に関係しています。

2

としては、私はあなたが3つのルート

  1. ルートの開始を持っている参照してください。 タイマ
  2. プロセッサを含む経路。 直接:dummydata
  3. 例外ルート。 RuntimeException.class

非常に簡単です。私はあなたの質問を修正しました。あなたの体のメッセージを最初に

  1. はnullです。

そして、私はあなたがこのケースでNULLあるルートの始点に存在した、まったく同じメッセージを使用することを意味している.useOriginalMessage()を使用している参照してください。 .useOriginalMessage()にコメントしたり削除したりすると、あなたの身体はと表示されます。

例外を次のように更新すると、メッセージが表示されます。

onException(RuntimeException.class) 
      //.useOriginalMessage() 
      .handled(true) 
      .log("after catching: ${body}"); 
関連する問題