Vous pouvez écrire l'extension WSDL qui permet au service WSIF d'accéder à un service SOAP qui utilise le mécanisme de transport JMS (Java™ Message Service).
Avant de commencer
Dans cette rubrique, il est supposé que vous avez choisi et configuré un fournisseur JMS lors de l'installation de WebSphere Application Server (le fournisseur de messagerie par défaut ou un autre fournisseur, par exemple le fournisseur de messagerie WebSphere MQ). Si ce n'est pas le cas, faites-le maintenant comme décrit dans
Choix d'un fournisseur de messagerie.
Pourquoi et quand exécuter cette tâche
Si un message SOAP contient uniquement du XML, il peut être transmis par le biais du mécanisme de transport JMS (Java Message Service) avec le type de corps de message JMS TextMessage.
Le message SOAP, y compris l'enveloppe SOAP, est encapsulé avec un message
JMS et placé sur la file d'attente appropriée. Le conteneur reçoit le message
JMS et en extrait le message SOAP à envoyer au
client.
Utilisez
la procédure suivante et les fragments de code associés pour écrire l'extension
WSDL devant permettre à votre service WSIF d'accéder à un protocole SOAP via un service JMS.
Remarque : Cette procédure vous permettra également d'écrire l'extension de liaison WSDL pour SOAP sur HTTP, étant donné que la liaison SOAP sur JMS est presque identique à la liaison SOAP sur HTTP.
Procédure
- Sélectionnez le protocole SOAP via la liaison JMS.
Vous définissez l'attribut transport de la balise <soap:binding> pour indiquer que JMS est utilisé. Si vous associez également l'attribut style
à la valeur rpc (Remote Procedure Call), WSIF (Web Services Invocation
Framework) présuppose qu'une opération est appelée sur le point de contact du service Web :
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/jms"/>
- Définissez l'adresse JMS.
Remarque : Voir également l'autre méthode permettant de spécifier l'adresse JMS dans l'étape suivante.
Pour SOAP sur JMS, la balise <wsdl:port> doit contenir un élément<jms:address>. Cet élément fournit les informations nécessaires pour permettre à un client de se connecter correctement au service Web à l'aide du modèle de programmation JMS. Généralement, ce sont les raccords générés pour la prise en charge de la liaison SOAP qui agissent comme
client JMS. Le client du service Web peut également utiliser directement
le modèle de programmation JMS.
L'élément
<jms:address> prend la forme suivante :
<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>
Les attributs accompagnés d'un point d'interrogation (
?)
sont facultatifs.
L'attribut facultatif jmsVendorURI est une chaîne
qui identifie de manière unique l'implémentation JMS. WSIF ignore cet URI, celui-ci étant
utilisé par le développeur du client et, éventuellement, par l'implémentation du client
pour déterminer s'ils ont accès au fournisseur JMS correct dans l'environnement d'exécution des clients.
Vous pouvez omettre les attributs facultatifs initialContextFactory et jndiProviderURL uniquement si l'environnement d'exécution dispose d'un fournisseur JNDI (Java Naming and Directory Interface) par défaut configuré.
L'attribut jndiConnectionFactoryName indique le nom d'un objet
JMS ConnectionFactory (fabrique de connexions), qui peut être recherché dans le contexte JNDI
défini par l'attribut jndiContext.
Cet objet ConnectionFactory est utilisé pour créer une connexion JMS à l'instance de
fournisseur JMS qui détient la file d'attente. Dans une configuration simple,
le même objet ConnectionFactory
est utilisé à la fois par l'écouteur (listener) de messages du serveur et
par les clients. Cependant, le serveur et les clients peuvent utiliser des objets
ConnectionFactory différents, à condition qu'ils créent des connexions à la même instance
de fournisseur JMS.
L'attribut value de
l'élément targetService dans <jms:propertyValue>
est le nom du composant de port du service cible, tel qu'il est défini dans l'élément <port-component-name>
du fichier webservices.xml de ce service cible.
- Définissez l'adresse JMS (méthode alternative).
Pour le fournisseur SOAP sur JMS, vous pouvez spécifier l'adresse JMS à l'aide de la balise <soap:address> au format suivant :
jms:/[queue|topic]?<property>=<value>&<property>=<value>&...
où
file d'attente ou
sujet correspond à l'attribut
destinationStyle de l'adresse JMS.
Tableau 1. Propriétés utilisables avec la balise <soap:address>. La colonne 1 indique le nom de la propriété, la colonne 2
décrit la propriété et la colonne 3 indique la valeur d'adresse JMS
correspondante.Nom de la propriété |
Description de la propriété |
Valeur d'adresse JMS correspondante |
destination |
Nom JNDI de la rubrique ou de la file d'attente de destination |
jndiDestinationName |
connectionFactory |
Nom JNDI de la fabrique de connexions |
jndiConnectionFactory |
targetService |
Nom du composant de port du service cible |
jms:propertyValue targetService dans jms:address |
Propriétés liées à JNDI (facultatives) : |
initialContextFactory |
Nom de la fabrique de contexte initial |
initialContextFactory |
jndiProviderURL |
URL du fournisseur JNDI |
jndiProviderURL |
Propriétés liées à JMS (facultatives) : |
deliveryMode |
Indique si le message de demande doit être persistant ou non. Les valeurs admises sont DeliveryMode.NON_PERSISTENT (par défaut) et DeliveryMode.PERSISTENT |
JMSDeliveryMode |
mot de passe |
Mot de passe permettant d'accéder à la fabrique de connexions. |
JMSPassword |
Priority |
Priorité JMS associée au message de demande. Les valeurs admises sont comprises entre 0 et 9. La valeur par défaut est 4. |
JMSDeliveryMode |
replyTo |
File de destination JNDI à laquelle les messages de réponses doivent être envoyés. |
JMSReplyTo |
timeToLive |
Durée de vie (en millisecondes) du message de demande. Une valeur égale à zéro indique une durée de vie illimitée. |
JMSTimeToLive |
userid |
ID utilisateur permettant d'accéder à la fabrique de connexions. |
JMSUserid |
Exemple de format :
format <jms:address> :
<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>
Format <soap:address> :
<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>
- Définissez les en-têtes et propriétés JMS.
Vous utilisez la balise <jms:property> pour définir les en-têtes et les propriétés JMS. Cette balise mappe une partie de message ou une valeur littérale à une propriété JMS :
<jms:property name="Priority" {part="requestPriority" | value="fixedValue"}/>
Si <jms:property> est associée à une valeur littérale, elle peut également être imbriquée dans la balise <jms:address> :
<jms:property name="Priority" value="fixedValue" />
Cette forme de balise <jms:property> est également utilisée dans la
liaison JMS native.
Exemple de WSDL définissant une liaison SOAP sur JMS
<!-- Example: SOAP over JMS Text Message -->
<?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>