Webservices-Interoperabilität - WS-Policies in der Praxis
Seite 3: Beispiel
Ein illustrierendes Beispiel
Die Grundlagen klingen viel versprechend. Zeit also, die Interoperabilität auszuprobieren. Als Erstes sei der Versuch gewagt, die Optimierungstechniken hinzuzuschalten. Dabei geht der Artikel nicht weiter ins Detail, sondern beschränkt sich auf die Nutzung. Das Beispiel sowie weitere Informationen finden die Leser unter der Adresse soa-academy.com zum Download.
Man wählt die Optimierung MTOM (Message Transfer Optimization) und den TCP-Transport. TCP steigert die Übertragungsgeschwindigkeit beachtlich, da sich damit eine Protokollebene ignorieren beziehungsweise auslassen lässt und so nicht interpretiert werden muss.
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:tns="http://www.fi.de/atm"
xmlns:atm-types="http://www.fi.de/atm/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
name="ATMService"
targetNamespace="http://www.fi.de/atm">
<wsp:UsingPolicy />
<wsp:Policy wsu:Id="ATMPortBindingPolicy">
<wsp:ExactlyOne>
<wsp:All>
<wsam:Addressing wsp:Optional="false"/>
<ns1:OptimizedTCPTransport
xmlns:ns1=
"http://java.sun.com/xml/ns/wsit/2006/09/
policy/soaptcp/service"
enabled="true" />
<ns2:OptimizedMimeSerialization
xmlns:ns2=
"http://schemas.xmlsoap.org/ws/2004/09/
policy/optimizedmimeserialization"
/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
...
<wsdl:binding name="ATMServiceSOAP" type="tns:ATMServicePort">
<wsp:PolicyReference URI="#ATMPortBindingPolicy" />
...
</wsdl:binding>
...
</definitions>
Als Erstes legt man also die WSDL-Datei für den Service an. Im Beispiel befindet sie sich im Verzeichnis wsdl
. Um den Java-Stub zu generieren, stehen zwei Wege offen, einerseits die Verwendung des Werkzeugs wsimport (es befindet sich im bin-Ordner der Java-Installation) oder andererseits die Nutzung eines Ant-Skripts. Für Letzteres spricht die bessere Automatisierbarkeit. Hierzu benötigt man jedoch die Metro-Installation, da der entsprechende Ant-Task nicht Bestandteil des JDK ist.
Nach dem Ausführen des Ant-Skripts oder des wsimport-Werkzeugs sollten die aus der WSDL resultierenden Java-Dateien entstanden sein. Es handelt sich um die vom Laufzeitsystem benötigten Java-Artefakte, um den Dienst anzusprechen. Ist eine der Dateien geöffnet, lassen sich die Informationen aus der WSDL-Datei leicht wiederfinden – aufbereitet für Java. Was jedoch nicht zu sehen ist, und das ist auch gut so, sind spezielle Angaben zu den Policies. Wie geschrieben, handelt es sich um Eigenschaften des Dienstes, die nachträglich noch zu verändern sind. Somit sind sie erst zur Zeit der Aktivierung des Dienstes oder bei der Verbindung mit einem Dienstnutzer auszuwerten.
Ist der Dienst-Stub generiert, kann die Implementierung des Dienstes erfolgen. Dazu legt man eine Java-Klasse für die Implementierung an. Wichtig ist, dass man den im Kopfteil der Klasse angegebenen Endpoint (spezifiziert in der WSDL des Dienstes) tatsächlich implementiert.
package de.fi.atm.impl;
import java.math.BigInteger;
import javax.jws.WebService;
import de.fi.atm.ATMServicePort;
import de.fi.atm.types.ATMOrderConfirmation;
import de.fi.atm.types.ATMOrderConfirmationType;
import de.fi.atm.types.ATMOrderType;
import de.fi.atm.types.ConfirmationReservationType;
@WebService(endpointInterface = "de.fi.atm.ATMServicePort")
public class ATMServiceImpl implements ATMServicePort {
@Override
public ATMOrderConfirmationType bookTicket(ATMOrderType parameters) {
ATMOrderConfirmationType result = new ATMOrderConfirmationType();
ATMOrderConfirmation confirmation = new ATMOrderConfirmation();
ConfirmationReservationType reservation =
new ConfirmationReservationType();
reservation.setRow(new BigInteger("21"));
reservation.setSeat(new BigInteger("42"));
confirmation.setConfirmed(true);
confirmation.setReservation(reservation);
result.getConfirmations().add(confirmation);
return result;
}
}
Unter der angegebenen Adresse des Beispiels findet sich ein vollständig konfiguriertes Eclipse-Projekt, das den OpenESB für die Ausführung des Dienstes nutzt. Es lässt sich jedoch auch jeder andere Webservice Container nutzen, er muss nur die Policy-Spezifikation verstehen.