Web Services Invocation Framework (WSIF) stellt eine Java-API für den Aufruf
von Web-Services bereit, die vom Format des für den Aufruf verwendeten Service oder Transportprotokolls unabhängig ist.
Vorbereitende Schritte
WSIF enthält einen EJB-Provider für den EJB-Aufruf mit
Remote Method Invocation over Internet Inter-ORB Protocol (RMI-IIOP). Allerdings sollten Sie für den
EJB(IIOP)-basierten Web-Service-Aufruf RMI-IIOP-Web-Services
mit JAX-RPC aufrufen.
Stellen Sie sicher, dass Ihre Anwendung nur einen Thread
verwendet, um WSIF aufzurufen.
Informationen zu diesem Vorgang
Die WSIF-API unterstützt den Aufruf von Web-Services, die in einer Web Services
Description Language (WSDL) definiert sind. WSIF ist für WSIF-Clients und Zwischenstationen von Web-Services bestimmt.
Die WSIF-API wird durch die abstrakte Servicebeschreibung in der WSDL
definiert, sie ist vollkommen unabhängig von der verwendeten
Bindung. Diese Unabhängigkeit vereinfacht die Verwendung der API, weil sie
WSDL-Begriffe für Nachrichtenabschnitte, Operationen und andere Elemente verwendet.
Die WSIF-API wurde für das WSDL-Verwendungsmodell entwickelt:
- Wählen Sie einen Port aus, der den erforderlichen Porttyp unterstützt.
- Rufen Sie die Operation auf, indem Sie die erforderliche abstrakte Eingabenachricht
bereitstellen, die sich aus den erforderlichen Teilen zusammensetzt, ohne dabei berücksichtigen zu müssen,
wie die Nachricht einem bestimmten Bindungsprotokoll zugeordnet wird.
Andere Web-Service-APIs, wie z. B. SOAP-APIs, sind nicht für
WSDL, sondern für ein bestimmtes Bindungsprotokoll mit der zugehörigen Syntax
bestimmt, z. B. Ziel-URIs und Codierungsstile.
Die Hauptschnittstellen der WSIF-API
werden in der folgenden Prozedur beschrieben.
Anmerkung: Apache unterstützt WSIF nicht mehr.
- Erstellen Sie mit der Schnittstelle "WSIFMessage" eine Nachricht, die an einen Port gesendet wird.
In WSDL beschreibt eine Nachricht den abstrakten Typ der Ein- und Ausgabe für
eine Operation. Die entsprechende WSIF-Klasse ist WSIFMessage, die im
Speicher die Ein- oder Ausgabe für eine Operation darstellt. Die
WSIFMessage-Schnittstelle trennt die Darstellung der Daten vom
abstrakten Typ, der von WSDL definiert wird.
Eine WSIFMessage-Klasse
ist ein Container für eine Gruppe benannter Komponenten. WSIFMessage-Klassen können zwischen Java Virtual Machines (JVMs) versendet werden.
- Wählen Sie aus, ob die WSIF-Nachricht zur Laufzeit als
Java™-Klasse oder als
XML dargestellt werden soll.
Es gibt zwei
Möglichkeiten, eine WSDL-Nachricht in einer Laufzeitumgebung darzustellen:
- Die generierte Java-Klasse, die auf einer WSDL-Java-Zuordnung, z. B. auf der von
JAX-RPC bereitgestellten Zuordnung, basiert.
- Die XML-Darstellung der Daten, z. B. mithilfe der SOAP-Codierung.
Jede Option bietet Vorzüge in anderen Szenarien. Die Java-Klasse wird
normalerweise verwendet, wenn WSIF auf einem Java-Standard-Client verwendet wird. In anderen
Szenarien jedoch, in denen WSIF als Zwischenstation verwendet wird, kann es effizienter sein,
eine WSDL-Nachricht im SOAP-Format zu verwenden.Die Darstellung, die zur Definition von Nachrichten verwendet wird, muss innerhalb
der Nachricht konsistent sein, d. h., alle Teile einer Nachricht müssen
konsistent sein. Eine Zeichenfolge -
getRepresentationStyle() -
gibt immer den Wert
null zurück. Das verdeutlicht, dass Teile dieser WSIFMessage-Klasse
als Java-Objekte dargestellt werden.
- Rufen Sie die Abschnitt der WSIF-Nachricht ab, und definieren Sie sie.
Mit den Methoden setObjectPart und setTypePart können Sie einer WSIFMessage-Klasse Teile hinzufügen. Alle Teile werden benannt. Teilenamen in einer Nachricht sind eindeutig. Wenn Sie einen Teil mehrfach definieren,
wird die letzte Einstellung verwendet.
Mit den Methoden getObjectPart und getTypePart können Sie Teile anhand ihres Namens aus einer
WSIFMessage-Klasse abrufen. Falls der benannte Teil nicht vorhanden ist, gibt die
Methode einen Fehler vom Typ WSIFException zurück.
Sie können Iteratoren verwenden, um mit den Methoden getParts() und getPartNames() Teile aus der Nachricht
abzurufen.
Die Reihenfolge, in der Teile definiert werden, ist gegenwärtig nicht wichtig,
aber die Nachrichtenimplementierung ist möglicherweise effizienter, wenn die Teile
in der von WSDL angegebenen Reihenfolge der Parameter definiert werden.
WSIFMessage-Klassen können geklont und serialisiert werden. Wenn die Teile nicht geklont
werden können, muss die Implementierung versuchen, sie mit Serialisierung zu klonen.
Wenn
die Teile auch nicht serialisiert werden können, wird beim Klonversuch eine
CloneNotSupportedException ausgelöst.
- Legen Sie den Namen der WSIF-Nachricht fest.
Zusätzlich zu den übergeordneten Teilen hat eine WSIFMessage-Klasse auch einen
Nachrichtennamen. Das ist erforderlich für das Überladen von Operationen, das von WSDL
und WSIF unterstützt wird.
Nähere Informationen zur Schnittstelle "WSIFMessage" (/wsi/org/apache/wsif/WSIFMessage.html)
finden Sie in der generierten API-Dokumentation, die über WSIF bereitgestellt wird.
- Suchen Sie über die Schnittstelle "WSIFService" und die Klasse "WSIFServiceFactory" eine Port-Factory oder einen Service suchen.
Die Schnittstelle "WSIFService"
ist eine Port-Factory, die den WSDL-Ansatz modelliert und unterstützt, in dem ein Service an einem oder mehreren Ports verfügbar sein kann.
Die Factory verbirgt die Implementierung des Ports.
WSIF
unterstützt dynamische Ports, die auf einem bestimmten Protokoll bzw.
Transport basieren und zur Laufzeit mit WSDL konfiguriert werden. Beispielsweise kann der dynamische SOAP-Port jeden SOAP-Service, der auf der
WSDL-Beschreibung dieses Service basiert, aufrufen, sodass Sie die Gruppe der verfügbaren Ports zur Laufzeit verbergen und ändern können.
Wenn Sie einen Service in einem WSDL-Dokument unter einer Webadresse oder in einer codegenerierten
Codebasis suchen möchten, verwenden Sie die Klasse "WSIFServiceFactory".
- Rufen Sie eine Operation über die Schnittstellen "WSIFPort" und "WSIFOperation" auf.
Eine WSIFPort-Schnittstelle verarbeitet die Einzeldaten für das Aufrufen einer Operation.
Der Port ermöglicht den Zugriff auf die Serviceimplementierung.
Ein WSDL-Dokument kann viele
verschiedene WSDL-Bindungen bereitstellen, und diese Bindungen können mehrere Ports
steuern.
Der Client kann einen Port auswählen, der Service-Stub kann einen Port auswählen, oder
WSIF kann einen Standardport auswählen.
Der Port bietet eine Schnittstelle für das Abrufen eines Operationsobjekts. Eine
WSIFOperation-Schnittstelle bietet die Möglichkeit, die angegebene Operation auszuführen.
Wenn der Port zu einem späteren Zeitpunkt serialisiert und
entserialisiert wird, stellt WSIF sicher, dass der Client dem Server die richtigen
Informationen zur Ermittlung der Instanz bereitstellt. Wenn die Serverinstanz
nicht mehr verfügbar ist, muss der Server festlegen, ob eine Fehlermeldung
ausgelöst oder eine neue Instanz bereitgestellt werden soll.
Dieses Verhalten kann vom Servicetyp abhängig sein. Für eine Enterprise-Bean speichert die WSIFPort-Schnittstelle
z. B. das EJB-Home-Verzeichnis und verwendet es, um die Bean vor jedem Aufruf
auszuwählen.
Der Client ist für die Serialisierung und Wartung
der Portinstanz verantwortlich, falls eine Unterstützung der Instanz erforderlich ist.
Der Client muss eine neue Operation
und Nachrichten für jeden Aufruf erstellen.