2012-03-29 8 views
1

Ich habe 2 benutzerdefinierte Aktionen hintereinander in den gleichen Dienst wie dieser AngenommenWie ohne Erreichen des Endes der Pipeline eine Antwort auf die Aufrufer eines Dienstes senden

<actions mep="RequestResponse"> 
    <action name="ActionA" class="ClassA"/> 
    <action name="ActionB" class="ClassB"/> 
</actions> 

exectuting dass ActionA einige Validierungen tut über die empfangene msg. Wenn die Überprüfungen festgestellt haben, dass die Nachricht ungültig ist, wie senden Sie eine Antwort an den Aufrufer über diesen Fehler?

Im Moment habe ich in ActionA die Antwort in der Nachricht gesetzt und eine Markierung darin gesetzt, die darauf hinweist, dass ich einen Fehler in ActionA und ActionB gefunden habe, bevor ich den Code ausführte. Ich fand diese Methode nützlich, aber eine Belastung, weil alle meine Handlungen anfangen mit:

if (!markIspressent) { 
    //Code goes here 
} 
return message. 

ich versucht habe, die Antwort msg bei ActionA Einstellung und Rückkehr null die Pipeline zu stoppen, aber das funktioniert nicht. Ich versuchte auch eine andere Methode, die ich fand, ActionProcessingFaultException(message,"SomeTextGoesInHere") zu werfen, aber das funktioniert auch nicht. Mein Hauptproblem mit diesem zweiten ist, dass der ESB versucht, die Nachricht neu zu verarbeiten, die diese Ausnahme ausgelöst hat, und ich sehe die Antwort nicht, die ich in Nachricht einstelle, bis der ESB aufgibt und es zurücksendet. Aber das Aufgeben dauert bis zu 60s.

Also meine Frage ist, wie können Sie eine Antwort msg an den Aufrufer vor dem Ende der Service-Pipeline zu erreichen.

Dank

Antwort

3

Die Optionen in Fertigstellung der Pipeline früher sind: - return null; - spaltete den Dienst in drei (Note Service 1 OneWay ist und auf der Grundlage Ihrer Handeln Ergebnisse Routen zu dem entsprechenden Dienst) Dienst 1

<actions mep="OneWay"> 
    <action name="ActionA" class="ClassA"/> 
    <action name="ActionA1" class="RouteBasedOnMsgContentTo(Service 2 or Service 3)"/> 
</actions> 

Service-2

<actions mep="RequestResponse"> 
    <action name="ActionB" class="ClassB"/> 
</actions> 

Service 3

<actions mep="RequestResponse"> 
    <action name="ActionC" class="ClassC-SimplyRespondsTheProblem"/> 
</actions>