2016-04-18 7 views
2

Die erste Route zum Erstellen des Eingabekörpers.Camel useOriginal Message funktioniert nicht

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"); 

Der zweite Weg, die Ausnahme und fängt es von onException zu werfen.

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"); 
       } 
      }); 

Erwartet: vor Ausnahme: einige Nachricht. nach dem Abfangen: eine Nachricht.

Reality:

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}]]] 

Warum die useOriginalMessage() hier nicht funktioniert?

Antwort

3

Das Problem scheint mit der Verwendung von "direct:" zu sein. Wenn Sie das zu "direct: vm" ändern, sollten Sie das gewünschte Ergebnis sehen.

Vielleicht hat der zugrunde liegende Grund damit zu tun, dass "direkt:" fast so behandelt wird, als wäre es ein direkter Anruf von der ersten Route, was einen leeren Ausgangskörper (vom Timer) impliziert.

2

Wie sehe ich, Sie haben drei Routen

  1. Starten der Route. Timer
  2. Route einschließlich Prozessor. direkt: Dummydata
  3. Exception Route. RuntimeException.class

Es ist sehr einfach. Ich habe deine Frage geändert.

  1. Am Anfang ist Ihre Nachricht Nachricht null.

Und ich sehe, Sie verwenden .useOriginalMessage() was bedeutet, die genau die gleiche Nachricht benutzen, die beim Starten der Route vorhanden war, die NULL in diesem Fall ist. Wenn Sie kommentieren oder entfernen .useOriginalMessage() dann wird es zeigen Sie Ihren Körper einige Nachricht.

Aktualisieren Sie die Ausnahme wie folgt, dann wird Ihre Nachricht angezeigt.

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