JAX-WS-Web-Services asynchron aufrufen
Java™ API for XML-Based Web Services (JAX-WS) bietet Unterstützung für den Aufruf von Web-Services über einen asynchronen Clientaufruf. JAX-WS unterstützt ein Callback- und ein Abfragemodell für den asynchronen Aufruf von Web-Services. Das Callback-Modell und das Abfragemodell sind im Dispatch-Client und im Dynamic-Proxy-Client verfügbar.
Vorbereitende Schritte
Entwickeln Sie einen JAX-WS-Dynamic-Proxy- oder -Dispatch-Client. Wenn Sie Dynamic-Proxy-Clients entwickeln, enthalten die generierten Serviceendpunktschnittstellen nach dem Generieren der portierbaren Clientartefakte aus einer WSDL-Datei (Web Services Description Language) mit dem Befehl wsimport keine asynchronen Methoden. Verwenden Sie JAX-WS-Bindungen, um der Schnittstelle für den dynamischen Proxy-Client die asynchronen Callback- oder Abfragemethoden hinzuzufügen. Zum Aktivieren asynchroner Zuordnungen können Sie der WSDL-Datei die Bindungsdeklaration jaxws:enableAsyncMapping hinzufügen. Weitere Informationen zum Hinzufügen von Bindungsanpassungen für die Generierung einer asynchronen Schnittstelle finden Sie im Kapitel 8 der JAX-WS-Spezifikation.

Informationen zu diesem Vorgang
Bei einem asynchronen Aufruf eines Web-Service wird dem Serviceendpunkt eine Anforderung gesendet. Anschließend wird die Steuerung unverzüglich an das Clientprogramm zurückgegeben, ohne eine Antwort des Service abzuwarten. Asynchrone JAX-WS-Web-Service-Clients konsumieren Web-Services über die Callback- oder die Abfragemethode. Wenn ein Abfragemodell verwendet wird, kann ein Client eine Anforderung absetzen und ein abgefragtes Antwortobjekt empfangen, um festzustellen, ob der Server reagiert. Wenn der Server antwortet, wird die tatsächliche Antwort abgerufen. Bei der Verwendung eines Callback-Modells stellt der Client einen Callback-Handler bereit, der das eingehende Antwortobjekt akzeptiert und verarbeitet. Sobald des Ergebnis verfügbar ist, wird die Methode handleResponse() des Handlers aufgerufen. Sowohl beim Abfrage- als auch beim Callback-Modell kann sich der Client auf die weitere Verarbeitung von Anforderungen konzentrieren, ohne auf die Rückgabe einer Antwort zu warten. Deshalb bieten diese beiden Modelle eine dynamischere und effizientere Methode zum Aufrufen von Web-Services. Abfrageaufrufe können über EJB-Clients (Enterprise JavaBeans) und Java EE-Anwendungsclients (Java Platform, Enterprise Edition) abgesetzt werden. Callback-Aufrufe sind nur über Java EE-Anwendungsclients gültig.
- Asynchrones Callback-Aufrufmodell verwenden
- Wenn Sie einen asynchronen Aufruf implementieren möchten, der das Callback-Modell verwendet, stellt der Client den Callback-Handler AsyncHandler bereit, der das eingehende Antwortobjekt akzeptiert und verarbeitet. Der Callback-Handler des Clients implementiert die Schnittstelle javax.xml.ws.AsyncHandler, die den Anwendungscode enthält, der ausgeführt wird, wenn eine asynchrone Antwort vom Server empfangen wird. Die Schnittstelle javax.xml.ws.AsyncHandler enthält die Methode handleResponse(java.xml.ws.Response), die aufgerufen wird, nachdem die Laufzeitumgebung die asynchrone Antwort vom Server empfangen und verarbeitet hat. Die Antwort wird dem Callback-Handler in Form eines javax.xml.ws.Response-Objekts zugestellt. Das Antwortobjekt gibt den Antwortinhalt zurück, wenn die Methode get() aufgerufen wird. Wenn ein Fehler empfangen wurde, wird während dieses Aufrufs eine Ausnahme an den Client zurückgegeben. Anschließend wird die Antwortmethode entsprechend dem Threading-Modell aufgerufen, das von der Steuerprogrammmethode java.util.concurrent.Executor in der java.xml.ws.Service-Instanz des Clients verwendet wird, die zum Erstellen der Dynamic-Proxy- oder Dispatch-Clientinstanz verwendet wurde. Das Steuerprogramm wird verwendet, um alle von der Anwendung registrierten asynchronen Callbacks aufzurufen. Verwenden Sie die Methoden setExecutor und getExecutor, um das für den Service konfigurierte Steuerprogramm zu ändern und abzurufen.
- Asynchrones Abfrageaufrufmodell verwenden
- Wenn das Abfragemodell verwendet wird, kann ein Client eine Anforderung absetzen und ein Antwortobjekt empfangen, das anschließend abgefragt werden kann, um festzustellen, ob der Server reagiert. Wenn der Server antwortet, kann die tatsächliche Antwort abgerufen werden. Das Antwortobjekt gibt den Antwortinhalt zurück, wenn die Methode get() aufgerufen wird. Der Client empfängt ein Objekt des Typs javax.xml.ws.Response von der Methode invokeAsync. Dieses Antwortobjekt wird verwendet, um den Status der Anforderung an den Server zu überwachen, zu bestimmen, wann die Operation abgeschlossen wurde, und um die Antwortergebnisse abzurufen.
- Asynchronen Nachrichtenaustausch verwenden
- Standardmäßig weisen asynchrone Clientaufrufe im Netz nicht das asynchrone Verhalten des Nachrichtenaustauschmusters auf. Das Programmiermodell ist asynchron, aber der Austausch der Anforderungs- und Antwortnachrichten mit dem Server ist nicht asynchron. Wenn Sie einen asynchronen Nachrichtenaustausch wünschen, müssen Sie die Eigenschaft com.ibm.websphere.webservices.use.async.mep im Clientanforderungskontext auf den booleschen Wert true setzen. Wenn diese Eigenschaft aktiviert ist, sind die zwischen dem Client und dem Server ausgetauschten Nachrichten anders als bei einem synchronen Nachrichtenaustausch. Bei einem asynchronen Nachrichtenaustausch werden den Anforderungs- und Antwortnachrichten WS-Addressing-Header hinzugefügt, die zusätzliche Routeninformationen für die Nachrichten enthalten. Ein weiterer wichtiger Unterschied zwischen dem asynchronen und dem synchronen Nachrichtenaustausch ist der, dass die Antwort einem asynchronen Listener zugestellt wird, der die Antwort anschließend zurück an den Client sendet. Beim asynchronen Nachrichtenaustausch gibt es kein Zeitlimit, das gesendet wird, um den Client anzuweisen, mit dem Warten auf eine Antwort aufzuhören. Wenn Sie den Client zwingen möchten, mit dem Warten auf eine Antwort aufzuhören, setzen Sie eine Methode Response.cancel() für das von einem Abfrageaufruf zurückgegebene Objekt bzw. eine Methode Future.cancel() für das von einem Callback-Aufruf zurückgegebene Objekt ab. Die Abbruchantwort hat keine Auswirkung auf den Server, wenn dieser eine Anforderung verarbeitet.

<soapenv:Header>
<wsa:To>http://target.bar.com:81/LiteSecurityService/SecurityService</wsa:To>
<wsa:ReplyTo>
<wsa:Address>http://myhost:2146/axis2/services/LiteSecurityService.
WSRMServicePort/AnonOutInOp?IBMwebservicesID=922A5DC38A337C4CEF1168347862705
</wsa:Address>
</wsa:ReplyTo>
<wsa:MessageID>urn:uuid:922A5DC38A337C4CEF1168347862403</wsa:MessageID>
<wsa:Action>getEndpointReference</wsa:Action>
</soapenv:Header>
Sie können dieses Problem beheben, indem Sie den Client so konfigurieren, dass er die Positionsdetails
für den asynchronen Listener im IP-Format sendet. Fügen Sie dazu der
Java Virtual Machine die folgende Systemeigenschaft hinzu.
Beachten Sie, dass bei der Übertragung der IP-Adresse die Vorteile von DHCP verloren gehen.
-Dcom.ibm.websphere.webservices.transportEPRInIPAddr=yes
gotchaVorgehensweise
Ergebnisse
Beispiel
@WebService
public interface CreditRatingService {
// Synchrone Operation.
Score getCreditScore(Customer customer);
// Asynchrone Operation mit Abfrage.
Response<Score> getCreditScoreAsync(Customer customer);
// Asynchrone Operation mit Callback.
Future<?> getQuoteAsync(Customer customer,
AsyncHandler<Score> handler);
}
- Callback-Methode verwenden
- Die Callback-Methode erfordert einen Callback-Handler, der im folgenden Beispiel gezeigt wird. Wenn Sie die Callback-Prozedur verwenden, ist nach dem Absetzen einer Anforderung der Callback-Handler für die Verarbeitung der Antwort verantwortlich. Der Antwortwert ist eine Antwort oder (unter Umständen) eine Ausnahme. Die Methode Future<?> stellt das Ergebnis einer asynchronen Berechnung dar, und es wird geprüft, ob die Berechnung abgeschlossen ist. Wenn die Anwendung herausfinden soll, ob die Anforderung abgeschlossen ist, rufen Sie die Methode Future.isDone() auf. Beachten Sie bitte, dass die Methode Future.get() keine aussagefähige Antwort bereitstellt und der Methode Response.get() nicht gleicht.
CreditRatingService svc = ...;
Future<?> invocation = svc.getCreditScoreAsync(customerTom,
new AsyncHandler<Score>() {
public void handleResponse (
Response<Score>response)
{
score = response.get();
// Anforderung verarbeiten...
}
}
);
- Abfragemethode verwenden
- Das folgende Beispiel veranschaulicht einen asynchronen Abfrageclient:
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerTom);
while (!response.isDone()) {
// Während der Wartezeit irgendetwas tun.
}
score = response.get();