Sie können eine WSDL-Erweiterung
(Web Services Description Language) schreiben, mit der Ihr WSIF-Service
(Web Services Invocation Framework) auf einen SOAP-Service zugreifen kann, der
Java™ Message Service (JMS) als Transportmechanismus
verwendet.
Vorbereitende Schritte
In diesem Artikel wird davon ausgegangen, dass Sie bei der Installation von
WebSphere Application Server einen JMS-Provider ausgewählt und konfiguriert haben (entweder
den Standard-Messaging-Provider oder einen anderen Provider wie den WebSphere MQ-Messaging-Provider). Sollten Sie noch keinen JMS-Provider ausgewählt und konfiguriert haben, tun Sie dies jetzt gemäß der Beschreibung im Artikel
Messaging-Provider auswählen.
Informationen zu diesem Vorgang
Wenn eine SOAP-Nachricht nur XML enthält, kann sie per JMS-Transport (Java Message Service) mit dem JMS-Typ für Nachrichtenhauptteile TextMessage übertragen werden. Die SOAP-Nachricht wird zusammen mit dem SOAP-Envelope in eine JMS-Nachricht integriert und in die entsprechende Warteschlange gestellt. Der Container empfängt die
JMS-Nachricht und entfernt die an den Client zu sendende SOAP-Nachricht.
Verwenden Sie diese Vorgehensweise und
die zugehörigen Codefragmente, um die WSDL-Erweiterung zu schreiben,
mit der Ihr WSIF-Service auf einen SOAP-over-JMS-Service zugreifen kann.
Anmerkung: Sie können diese Prozedur
auch als Leitfaden zum Schreiben der WSDL-Bindungserweiterung für SOAP over HTTP verwenden, da die SOAP-over-JMS-Bindung sich nur geringfügig von der SOAP-over-HTTP-Bindung unterscheidet.
Vorgehensweise
- Wählen Sie die SOAP-over-JMS-Bindung aus.
Mit dem Attribut transport des Tag <soap:binding> legen Sie fest, dass JMS
verwendet werden soll. Wenn Sie außerdem das Attribut style auf rpc (Remote Procedure Call) setzen, geht das Web
Services Invocation Framework (WSIF) davon aus, dass eine Operation für den Web-Service-Endpunkt aufgerufen wird:
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/jms"/>
- Legen Sie die JMS-Adresse fest.
Anmerkung: Lesen Sie auch die Informationen zur alternativen Methode
für die Angabe von JMS-Adressen im nächsten Schritt.
Für SOAP over JMS muss das Tag <wsdl:port> ein Element <jms:address> enthalten. Dieses Element enthält die Informationen,
die ein Client benötigt, um die Verbindung zum Web-Service
mit dem JMS-Programmiermodell ordnungsgemäß herzustellen. Normalerweise sind es die zur Unterstützung der SOAP-over-JMS-Bindung
generierten Stubs, die als JMS-Client auftreten.
Alternativ kann der Web-Service-Client das JMS-Programmiermodell direkt verwenden.
Das Element
<jms:address> hat das folgende Format:
<jms:address
destinationStyle= "queue"
jmsVendorURI = "http://ibm.com/ns/mqseries"?
initialContextFactory= "com.ibm.NamingFactory"?
jndiProviderURL= "iiop://something:900/wherever"?
jndiConnectionFactoryName= "orange"
jndiDestinationName="fred">
<jms:propertyValue name="targetService" type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
Die mit einem Fragezeichen (
?) gekennzeichneten Attribute sind optional.
Das
optionale Attribut jmsVendorURI ist eine Zeichenfolge, die die JMS-Implementierung eindeutig
bezeichnet. WSIF ignoriert diesen URI, den der Cliententwickler und vielleicht auch die Clientimplementierung
verwendet, um festzustellen, ob Zugriff auf den richtigen JMS-Provider
in der Clientlaufzeitumgebung besteht.
Die optionalen Attribute initialContextFactory und jndiProviderURL dürfen nur ausgelassen werden, wenn für die Laufzeitumgebung ein Standard-JNDI-Provider (Java Naming and Directory
Interface) konfiguriert ist.
Das Attribut
jndiConnectionFactoryName gibt den Namen eines JMS-ConnectionFactory-Objekts an, das dann in dem vom
Attribut jndiContext bezeichneten JNDI-Kontext gesucht werden kann.
Mit diesem ConnectionFactory-Objekt kann eine JMS-Verbindung zu der JMS-Providerinstanz erstellt werden, die Eigner
der Warteschlange ist. In einer einfachen Konfiguration wird das
ConnectionFactory-Objekt vom Nachrichtenlistener des Servers und von den Clients gemeinsam verwendet. Server und Clients können jedoch auch unterschiedliche
ConnectionFactory-Objekte verwenden, sofern
diese Verbindungen zu derselben JMS-Providerinstanz herstellen.
Das Attribut value
des targetService-Elements <jms:propertyValue> ist der Name der Portkomponente für den Zielservice,
der im Element <port-component-name> der Datei
webservices.xml für den Zielservice definiert ist.
- Legen Sie die JMS-Adresse fest (Alternativverfahren).
Für den
Provider für SOAP over JMS können Sie die JMS-Adresse auch mit dem Tag <soap:address>
angeben, für das Sie das folgende Format verwenden:
jms:/[Warteschlange|Topic]?<Eigenschaft>=<Wert>&<Eigenschaft>=<Wert>&...
Hierbei entspricht die Angabe von
Warteschlange oder
Topic dem Attribut
destinationStyle der JMS-Adresse.
Tabelle 1. Eigenschaften, die für das Tag <soap:address>
gültig sind. Spalte 1 enthält den Eigenschaftsnamen, Spalte
2 beschreibt die Eigenschaft, und Spalte 3 enthält den entsprechenden
JMS-Adresswert. Eigenschaftsname |
Eigenschaftsbeschreibung |
Entsprechender JMS-Adresswert |
destination |
Der JNDI-Name der Zielwarteschlange bzw. des Zieltopics. |
jndiDestinationName |
connectionFactory |
Der JNDI-Name der Verbindungsfactory. |
jndiConnectionFactory |
targetService |
Der Name der Portkomponente des Zielservice |
targetService jms:propertyValue within jms:address |
JNDI-bezogene Eigenschaften (optional): |
initialContextFactory |
Der Name der Ausgangskontextfactory. |
initialContextFactory |
jndiProviderURL |
Der URL des JNDI-providers. |
jndiProviderURL |
JMS-Eigenschaften (optional): |
deliveryMode |
Gibt an, ob die Anforderungsnachricht persistent sein soll. Die gültigen
Werte sind DeliveryMode.NON_PERSISTENT (Standardeinstellung) und
DeliveryMode.PERSISTENT |
JMSDeliveryMode |
password |
Das Kennwort, mit dem auf die Verbindungsfactory zugegriffen wird. |
JMSPassword |
priority |
Die JMS-Priorität, die der Anforderungsnachricht zugeordnet wird.
Die gültigen Werte sind 0 bis 9. Der Standardwert ist 4. |
JMSDeliveryMode |
replyTo |
Die JNDI-Zielwarteschlange, an die Antwortnachrichten gesendet werden sollen. |
JMSReplyTo |
timeToLive |
Die Lebensdauer (in Millisekunden) der Anforderungsnachricht.
Der Wert 0 definiert eine unbegrenzte Lebensdauer. |
JMSTimeToLive |
userid |
Die Benutzer-ID, mit der auf die Verbindungsfactory zugegriffen wird. |
JMSUserid |
Nachfolgend sehen Sie ein Beispiel für dieses Format:
<jms:address> format:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory= "com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
<soap:address> format:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<soap:address location="jms:/queue?connectionFactory=myQCF&destination
=myQ&initialContextFactory=com.ibm.NamingFactory&jndiProviderURL
=iiop://something:900/&targetService=StockQuoteServicePort" />
</wsdl:port>
- Legen Sie die JMS-Header und -Eigenschaften fest.
Mit dem Tag <jms:property> werden die JMS-Header und -Eigenschaften definiert.
Dieses Tag wird in einer JMS-Eigenschaft entweder einem Nachrichtenabschnitt oder einem Literalwert zugeordnet:
<jms:property name="Priorität" {part="requestPriority" | value="festgelegter_Wert"}/>
Wenn <jms:property> einen Literalwert enthält, kann es auch im Tag
<jms:address> verschachtelt angegeben werden:
<jms:property name="Priority" value="fixedValue" />
Diese Form
des Tag <jms:property> wird auch in der nativen JMS-Bindung verwendet.
Das folgende WSDL-Beispiel definiert eine SOAP-over-JMS-Bindung:
<!-- Beispiel: SOAP-over-JMS-Textnachricht -->
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
name="StockQuoteInterfaceDefinitions"
targetNamespace="urn:StockQuoteInterface"
xmlns:tns="urn:StockQuoteInterface"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:jms="http://schemas.xmlsoap.org/wsdl/jms/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="GetQuoteInput">
<part name="symbol" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="GetQuoteOutput">
<part name="value" type="xsd:float"/>
</wsdl:message>
<wsdl:portType name="StockQuoteInterface">
<wsdl:operation name="GetQuote">
<wsdl:input message="tns:GetQuoteInput"/>
<wsdl:output message="tns:GetQuoteOutput"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StockQuoteSoapJMSBinding" type="tns:StockQuoteInterface">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/jms"/>
<wsdl:operation name="GetQuote">
<soap:operation soapAction="urn:StockQuoteInterface#GetQuote"/>
<wsdl:input>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StockQuoteService">
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory= "com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>