2016-04-18 32 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"); 

第二條拋出異常並通過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」,並且您應該看到所需的結果。

也許潛在的原因與「direct:」的處理差不多,就好像它是來自第一條路線的直接呼叫,因此意味着一個空的起始主體(來自定時器)。

2

正如,我看你有3條路線

  1. 路線的起點。 定時器
  2. 包括處理器的路由。 直接:dummydata
  3. 異常路由。 RuntimeException.class

這很簡單。我修改了你的問題。

  1. 在開始您的身體信息爲空。

而且,我看你正在使用.useOriginalMessage()這意味着使用的是目前在這NULL在這種情況下路線的起點完全相同的消息。當你將評論或刪除.useOriginalMessage()然後它會告訴你你的身體一些消息。

更新如下例外,它會顯示您的消息。

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