2016-07-29 19 views
2

Ich muss eine Fehlerbehandlung implementieren, die die Camel Redelivery-Richtlinie für einen Geschäftsprozess verwendet, die eine SOAP-Anforderung sendet und ihre Antwort verarbeitet. Während des Prozessteils kann eine spezielle Ausnahme (RetryException) ausgelöst werden. Diese Exception wird (dank onException (RetryException.class)) auf der Fehlerbehandlungsebene abgefangen. Das war der einfache Teil.So ignorieren Sie eine Ausnahme in Camel beim erneuten Senden

Jetzt möchte ich Ausnahmen, die durch den CXF-Endpunkt (im Falle eines Verbindungsfehlers pro Beispiel) ausgelöst werden könnten, ignorieren und sie verarbeiten. Also versuche ich:

  • (1) Eine Hauptroute, die die OnException Klausel mit Wiederholungsstrategie
  • (2) Eine Unter Route, die aggregiert 2 Routen (und hat noErrorHandler) sicher sein replay den 2 Routen und die Verarbeitung einen nicht nur, dass die Ausnahme aus:
    • (3) die Route, die die SOAP-Anforderung senden
    • (4), um die Strecke, die die Antwort zu verarbeiten und kann die retryException werfen.

Um die Ausnahme von der cxf Endpunkt geworfen zu ignorieren ich die Strecke (3) wie die Umsetzung:

public void configure() { 
    from(ROUTE_NAME). 
    .handleFault() // To handle Soap fault 
    .onException(Fault.class) 
     .continued(true) 
     .end() 
    .to("cxf:[...]") 
    ; 
} 

Es funktioniert wie ein Charme, führen Sie die Antwortprozessor einige Prüfungen vor die RetryException zu werfen ... Aber die fortgesetzte Anweisung wirft alle Informationen über die Neulieferung weg, die ich vorher hatte und Camel glauben, dass diese Ausnahme die erste ist. So tritt die Route in eine Art Wiederholungsschleife ein.

Exchange-Header vor OnException (Fehler):

Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, CamelRedelivered=true, CamelRedeliveryCounter=1, CamelRedeliveryMaxCounter=2, operationName=[...]} 

Exchange-Header nach OnException (Fehler):

Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, operationName=[...]} 

Haben Sie eine Lösung haben einige Unter Route Ausnahme zu ignorieren ohne die Strategie zum Wiederholen der oberen Route zu löschen?

Antwort

0

Ich vermute, Sie verbinden die Routen über direct Endpunkt; Wenn das der Fall ist, denke ich, dass Ihr Hauptproblem ist, dass Sie Fault als Fortsetzung markieren, was bedeutet, dass behandelt wird, was höchstwahrscheinlich dazu führt, dass Ihre Redelivery-Header gelöscht werden. Sie könnten versuchen, seda oder eine Nachrichtenwarteschlange zu verwenden, nur nicht den direct Endpunkt, da es im Grunde Ihre Routen in eins verbindet.

+1

Danke Das funktioniert, aber ich habe auf andere Weise mit DoTry und DoCatch getan. –

Verwandte Themen