Beispiel: Einen Web-Service erstellen, der die API "JAX-WS Web Services Addressing" verwendet, um auf eine generische Web-Service-Ressourceninstanz zuzugreifen

Stellen Sie sich eine IT-Abteilung vor, die ein Druckernetz besitzt, das mit Web-Services verwaltet werden soll. Die Abteilung kann jeden Drucker als Ressource darstellen, die über eine Endpunktreferenz adressiert wird. Dieses Beispiel veranschaulicht, wie ein solcher Service mit den APIs "JAX-WS Web Services Addressing (WS-Addressing)" codiert wird, die von WebSphere Application Server bereitgestellt werden.

Eine Web-Service-Schnittstelle bereitstellen, die eine Endpunktreferenz auf den Zielservice zurückgibt

Die IT-Organisation implementiert einen PrinterFactory-Service, der ein CreatePrinter-Element "portType" anbietet. Dieses Element "portType" akzeptiert eine CreatePrinterRequest-Nachricht, um eine Ressource zu erstellen, die einen logischen Drucker darstellt, und antwortet mit einer Endpunktreferenz, die eine Referenz auf die Ressource ist.

Die WSDL-Definition für einen solchen PrinterFactory-Service könnte den folgenden Code enthalten:
<wsdl:definitions targetNamespace="http://example.org/printer" ...
                  xmlns:pr=" http://example.org/printer">
  <wsdl:types>
    ...
    <xsd:schema...>
      <xsd:element name="CreatePrinterRequest"/>
      <xsd:element name="CreatePrinterResponse" 
                   type="wsa:EndpointReferenceType"/>
    </xsd:schema>   </wsdl:types>
  <wsdl:message name="CreatePrinterRequest">
    <wsdl:part name="CreatePrinterRequest" 
               element="pr:CreatePrinterRequest" />
  </wsdl:message>
  <wsdl:message name="CreatePrinterResponse">
    <wsdl:part name="CreatePrinterResponse" 
               element="pr:CreatePrinterResponse" />
  </wsdl:message>
  <wsdl:portType name="CreatePrinter">
    <wsdl:operation name="createPrinter">
      <wsdl:input name="CreatePrinterRequest" 
                  message="pr:CreatePrinterRequest" />
      <wsdl:output name="CreatePrinterResponse"
                  message="pr:CreatePrinterResponse" />
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

Die Operation "CreatePrinter" im vorherigen Beispiel gibt ein Objekt "wsa:EndpointReference" zurück, das die neu erstellte Printer-Ressource darstellt. Der Client kann diese Endpunktreferenz verwenden, um Nachrichten an die Serviceinstanz zu senden, die den Drucker darstellt.

Web-Service-Schnittstelle implementieren

Die im folgenden Beispiel veranschaulichte Methode "createPrinter" ruft die Kennung der jeweiligen Druckerressourceninstanz ab. Anschließend erstellt die Operation eine Endpunktreferenz auf den Druckerservice und ordnet die Drucker-ID der Endpunktreferenz zu. Abschließend gibt die Methode "createPrinter" die Endpunktreferenz zurück.

import javax.xml.ws.wsaddressing.W3CEndpointReference;
import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;

import javax.xml.namespace.QName;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class MyClass {

  // Drucker erstellen
  ...

  // Druckerressourcen-ID als statischen Inhalt definiert, weil dies in späteren Schritten erforderlich ist
    public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "..."); 
    public static final QName PRINTER_ENDPOINT_NAME = new QName("example.printer.com", "PrinterService", "...");
    
    public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
    {
     Document document = ...;

     // Die statusabhängige Ressource erstellen oder suchen und eine Zeichenfolge für die
 // Ressourcen-ID ableiten
     String resource_identifier = "...";
     
     // Diese Ressourcen-ID der Endpunktreferenz als
 // Referenzparameter zuordnen.
     // Es kann ein beliebiger Name ausgewählt werden. Er sollte
// jedoch für den Service eindeutig sein.
     Element element = document.createElementNS("example.printersample",
             "IBM_WSRF_PRINTERID");
     element.appendChild( document.createTextNode(resource_identifier) );
     ...
     
     // Eine Endpunktreferenz mit dem URI und Portnamen des entsprechenden Web-Service erstellen
     // Alternativ kann die Methode "getEndpointReference()" von MessageContext verwendet werden.
     W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
     builder.serviceName(PRINTER_SERVICE_QNAME);
     builder.endpointName(PRINTER_ENDPOINT_NAME);
     builder.referenceParameter(element);
     
     // Die Endpunktreferenz verweist jetzt auf die Ressource und nicht auf den Service.
     return builder.build();
    }
}

Zielservice für die Zuordnung eingehender Nachrichten zu Web-Service-Ressourceninstanzen erweitern

Aufgrund der zuvor beschriebenen Web-Service-Implementierung hat die Druckerressourceninstanz jetzt eine eindeutige ID, die in die zugehörige Endpunktreferenz integriert wird. Diese ID erscheint als Referenzparameter im SOAP-Header nachfolgender Nachrichten für den Web-Service und kann vom Web-Service verwendet werden, um eingehende Nachrichten dem entsprechenden Drucker zuzuordnen.

Wenn ein Web-Service eine Nachricht empfängt, die Adressierungseigenschaften für WS-Addressing-Nachrichten enthält, verarbeitet WebSphere Application Server diese Eigenschaften, bevor die Nachricht an den Anwendungsendpunkt zugestellt wird, und fügt sie in den Nachrichtenkontext im Thread ein. Die Web-Service-Anwendung "Printer" greift, wie im folgenden Beispiel gezeigt, über das Objekt "WebServiceContext" auf die Referenzparameter zu, die dem Zielendpunkt zugeordnet sind:

@Resource
private WebServiceContext context;
...
List list = (List) context.getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);

Wenn Ihre Anwendung die Version vom August 2004 (2004/08) der WS-Addressing-Spezifikation verwendet, verwenden Sie die IBM proprietäre Anwendungsprogrammierschnittstelle, um die Nachrichtenparameter abzurufen, wie im folgenden Beispiel gezeigt:

import com.ibm.websphere.wsaddressing.EndpointReferenceManager; 
...
 // Referenzparameter initialisieren
 QName name = new QName(..);
 // Zeichenfolgewert extrahieren
 String resource_identifier = 
        EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);

Die Web-Service-Implementierung kann Nachrichten auf der Basis der Drucker-ID an die entsprechenden Druckerinstanzen weiterleiten.

Endpunktreferenzen zum Senden von Nachrichten an einen Endpunkt verwenden

Der Client verwendet die vom Service zurückgegebene Endpunktreferenz, um einen JAX-WS-Proxy für den Drucker zu erstellen, wie im folgenden Beispiel gezeigt.
javax.xml.ws.Service jaxwsServiceObject= ...;
W3CEndpointReference epr = ...;
...
Printer myPrinterProxy = jaxwsServiceObject.getPort(epr, Printer.class, new AddressingFeature());
Das Proxy-Objekt stellt jetzt die neue Druckerressourceninstanz dar und kann vom Client verwendet werden, um Nachrichten über den Web-Service "Printer" an den Drucker zu senden. Wenn der Client den Service aufruft, fügt WebSphere Application Server die erforderlichen Eigenschaften für die Nachrichtenadressierung zum Nachrichtenheader hinzu. Dies ist in diesem Fall ein Referenzparameter, der in der Endpunktreferenz enthalten ist, die die Zieldruckerressource angibt.

Aus der Perspektive des Clients ist die Endpunktreferenz nicht transparent. Der Client kann den Inhalt von Endpunktreferenzparametern nicht interpretieren und sollte von jeglicher Verwendung dieser Parameter Abstand nehmen. Clients können Instanzen von Endpunktreferenzen nicht direkt erstellen, weil die Referenzparameter private Parameter des Service-Providers sind. Clients müssen Endpunktreferenzen vom Service-Provider abrufen, z. B. über einen Providerfactoryservice, und sie anschließend verwenden, um Web-Service-Operationen an den von der Endpunktreferenz dargestellten Endpunkt weiterzuleiten.


Symbol, das den Typ des Artikels anzeigt. Referenzartikel



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