2017-11-24 1 views
0

Ich habe einen dynamischen Endpunkt mit. RecipientList(), und ich möchte den Endpunkt im Falle einer Ausnahme ändern. Hier ist mein Beispiel:Apache Camel: Ändern Endpunkt bei Neulieferung

onException(IOException.class) 
.maximumRedeliveries(2) 
.onRedelivery(urlChangeProcessor) 
.process(failureProccessor); 

from("direct:foo") 
.recipientList(simple("cxf:${exchangeProperty.targetUrl}?dataFormat=POJO")); 

Auf Ausnahme vor der Nachlieferung des „urlChangeProcessor“ aktualisiert die „targetUrl“ Eigenschaft mit der korrekten URL, aber die Nachlieferung Versuch wird noch auf die falsche URL gemacht.

Ist es nicht möglich, den Zielendpunkt bei erneuter Lieferung zu ändern? Wenn nicht, was ist eine elegante Lösung? Meine aktuelle Problemumgehung ist DoTry/DoCatch, Ändern der Eigenschaft in der DoCatch und erneutes Senden an den gleichen Endpunkt.

Ich benutze Kamel 2.15.3

Vielen Dank im Voraus!

+0

Ich denke, Sie müssen die Ausnahme als behandelt 'javaonException (ValidationException) .handled (true);', so dass camel nicht versuchen, dasselbe zu tun, stattdessen verwenden Sie Ihre URL-Change-Prozessor. Http://camel.apache.org/exception-clause.html – pvpkiran

+0

Die Einstellung '.handled (true)' markiert den Austausch als behandelt, so dass der Anrufer die Ausnahme nicht empfängt und der Austausch an einen anderen Endpunkt weitergeleitet werden kann. Nach meinem Wissen geschieht dies, nachdem die Wiederholungen erschöpft sind. Aber ich möchte die URL bei jedem erneuten Versuch ändern. –

+1

Sie können dies nicht tun, Sie müssten das dynamische Router-Muster verwenden und dann die URL neu berechnen, wenn Sie feststellen, dass zuvor eine Ausnahme ausgelöst wurde. –

Antwort

0

Da dies nicht möglich ist, ist die Lösung in meinem Fall die onException zu entfernen und fügen Sie eine doTry/doCatch:

from("direct:foo") 
.doTry() 
    .to("direct:out") 
.doCatch(IOException.class) 
    .process(urlChangeProcessor) 
    .to("direct:foo") 
.end(); 

from("direct:out") 
.simple("cxf:${exchangeProperty.targetUrl}?dataFormat=POJO"); 

einige Bedingungen hinzufügen, um diese in einer Endlosschleife enden nicht.

Verwandte Themen