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.

Unterstützte Konfigurationen Unterstützte Konfigurationen: Wenn Sie das Tool wsimport ausführen und den asynchronen Aufruf über eine JAX-WS-Bindungsdeklaration "enableAsyncMapping" aktivieren, müssen Sie sicherstellen, dass die entsprechende Antwortnachricht Ihrer WSDL-Datei keine Abschnitte enthält. Wenn eine Antwortnachricht keine Abschnitte enthält, ist die Anforderung eine bidirektionale Anforderung, aber die eigentlich Antwort, die zurückgesendet wird, ist leer. Das Tool wsimport kann leere Antworten nicht ordnungsgemäß bearbeiten. Zur Vermeidung dieses Szenarien können Sie die Ausgabenachricht aus der Operation entfernen, woraufhin aus der Operation eine unidirektionale Operation wird, oder Sie können Ihrer Nachricht ein Element <wsdl:part> hinzufügen. Weitere Informationen zur Verwendung, zur Syntax und zu den Parametern für das Tool wsimport finden Sie in der Dokumentation "Befehl 'wsimport' für JAX-WS-Anwendungen". sptcfg

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.
Fehler vermeiden Fehler vermeiden: Die Position des asynchronen Listeners wird an den Server gesendet, so dass der Service dem Client antworten kann. Unter Windows-Betriebssystemen wird standardmäßig der Name des lokalen Hosts verwendet, weil dieser mit Dynamic Host Configuration Protocol (DHCP) kompatibel ist. Falls der Server den Hostnamen jedoch nicht auflösen kann, empfängt die Clientanwendung keine Antworten vom Zielservice. Beispiel: Eine Clientanwendung befindet sich auf der Workstation "myhost.bar.com". Im folgenden SOAP-Nachrichtenheader sendet die Clientanwendung den Kurznamen "myhost" als Hostdetails. Wenn der Zielserver "myhost" nicht in "myhost.bar.com" auflösen kann, erreichen nachfolgede Antworten die Clientanwendung nicht:
  <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
gotcha

Vorgehensweise

  1. Legen Sie fest, ob die Callback-Methode oder die Abfragemethode implementiert werden soll, damit der Client den Web-Service asynchron aufruft.
  2. (Optional) Konfigurieren Sie den Clientanforderungskontext. Fügen Sie dem Anforderungskontext die Eigenschaft
    com.ibm.websphere.webservices.use.async.mep
    hinzu, um das asynchrone Messaging für den Web-Service-Client zu aktivieren. Die Verwendung dieser Eigenschaft erfordert, dass der Serviceendpunkt WS-Addressing unterstützt, das standardmäßig für den Anwendungsserver unterstützt wird. Das folgende Beispiel veranschaulicht, wie diese Eigenschaft gesetzt wird:
    Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
     rc.put("com.ibm.websphere.webservices.use.async.mep", Boolean.TRUE);
  3. Führen Sie die folgenden Schritte aus, um die asynchrone Callback-Methode zu implementieren.
    1. Suchen Sie die asynchrone Callback-Methode in der Serviceendpunktschnittstelle oder in der Schnittstelle javax.xml.ws.Dispatch. In einer Serviceendpunktschnittstelle endet der Methodenname mit Async und hat einen Parameter mehr als die synchrone Methode des Typs javax.xml.ws.AsyncHandler. Die Methode invokeAsync(Object, AsyncHandler) ist die Methode, die in der Dispatch-Schnittstelle verwendet wird.
    2. (Optional) Fügen Sie der Clientanwendung die service.setExecutor-Methoden hinzu. Wenn Sie die Steuerprogrammmethoden hinzufügen, kann der Client die Planungsmethoden für die Verarbeitung der Antwort steuern. Sie können auch die Klassenfactory java.current.Executors verwenden, um gepackte Steuerprogramme abzurufen oder eine eigene Steuerprogrammklasse implementieren. Weitere Informationen zur Verwendung von Methoden einer Steuerprogrammklasse für Ihren Client finden Sie in der JAX-WS-Spezifikation.
    3. Implementieren Sie die Schnittstelle javax.xml.ws.AsyncHandler. Die Schnittstelle javax.xml.ws.AsyncHandler enthält nur die Methode handleResponse(javax.xml.ws.Response). Die Methode muss die Logik für die Verarbeitung der Antwort oder (unter Umständen) einer Ausnahme enthalten. Die Methode wird aufgerufen, nachdem die Clientlaufzeitumgebung die asynchrone Antwort vom Server empfangen und verarbeitet hat.
    4. Rufen Sie die asynchrone Callback-Methode mit den Parameterdaten und dem Callback-Handler auf.
    5. Die Methode handleResponse(Response) wird für das Callback-Objekt aufgerufen, sobald die Antwort verfügbar ist. Die Methode Response.get() wird in dieser Methode aufgerufen, um die Antwort zuzustellen.
  4. Gehen Sie wie folgt vor, um die Abfragemethode zu implementieren:
    1. Suchen Sie die asynchrone Abfragemethode in der Serviceendpunktschnittstelle oder in der Schnittstelle javax.xml.ws.Dispatch. In einer Serviceendpunktschnittstelle endet der Methodenname mit Async und hat den Rückgabetyp javax.xml.ws.Response. Die Methode invokeAsync(Object) wird in der Dispatch-Schnittstelle verwendet.
    2. Rufen Sie die asynchrone Abfragemethode mit den Parameterdaten auf.
    3. Der Client empfängt ein Objekt des Typs javax.xml.ws.Response, das verwendet wird, um den Status der Anforderung an den Server zu überwachen. Die Methode isDone() gibt an, ob der Aufruf abgeschlossen ist. Wenn die Methode isDone() den Wert true zurückgibt, wird die Methode get() aufgerufen, um das Antwortobjekt abzurufen.
  5. Verwenden Sie die Methode cancel() für die Callback- oder Abfragemethode, wenn der Client mit dem Warten auf eine Antwort vom Service aufhören muss. Wenn der Client die Methode cancel() aufruft, setzt der Endpunkt die Verarbeitung der Anforderung fort. Die Wartezeit und Antwortverarbeitung für den Client wird jedoch gestoppt.

Ergebnisse

Sie haben Ihren JAX-WS-Web-Service-Client so aktiviert, dass er Web-Services asynchron aufruft und konsumiert. Weitere Informationen zu den asynchronen Client-APIs finden Sie in der Spezifikation JAX-WS.

Beispiel

Das folgende Beispiel veranschaulicht eine Web-Service-Schnittstelle mit Methoden für asynchrone Anforderungen vom Client.
@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();

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsclientasync
Dateiname:twbs_jaxwsclientasync.html