Protocole SOAP et JMS
Le moteur de services Web prend en charge l'utilisation du transport de messages compatibles SOAP sur JMS (Java™ Message Service) de norme de l'industrie émergente, comme une alternative à HTTP pour la communication des messages SOAP entre les clients et les serveurs.

IBM® et d'autres fournisseurs travaillent sur la spécification SOAP sur JMS depuis 2005. Cette spécification a été soumise à W3C et un groupe de travail a été créé. La soumission des membres actuels de cette spécification de projet a été publiée conjointement en octobre 2007. Pour plus de détails sur cette norme de l'industrie, voir la spécification SOAP sur JMS.
Utilisez le protocole de transport standard industriel émergeant SOAP sur JMS si vous devez fournir des implémentations pour les composants client ou serveur. Vous devez également vous assurer que ces implémentations sont interopérables avec les composants client et serveur fournis par le moteur de services Web dans WebSphere Application Server.
- Le client doit utiliser un objet javax.jms.BytesMessage ou un objet javax.jms.TextMessage pour transmettre le message de la requête SOAP au serveur.
- Avant d'envoyer le message à la file d'attente ou au sujet de destination, le client doit définir les propriétés suivantes sur le message de demande JMS :
- SOAPJMS_contentType : Cette propriété, similaire à l'en-tête Content-Type présent dans un message HTTP, sert à décrire le type de contenu du message. Un message SOAP en texte pur, par exemple un message sans pièces jointes, dispose de la valeur suivante définie pour cette propriété du message JMS :
text/xml; charset="UTF-8"
Pour un message SOAP contenant des pièces jointes, utilisez le code suivant pour définir la propriété SOAPJMS_contentType du message JMS :
Cet exemple présente un message à plusieurs parties dont la première partie, qui contient l'enveloppe SOAP, est du type text/xml. Les autres parties de ce message à plusieurs parties contiennent différentes pièces jointes. La spécification HTTP 1.1 contient davantage d'informations sur l'en-tête Content-Type.multipart/related; type="text/xml"; start="<...content-id_of_first_ part...>"
- enableTransaction: Définissez cette propriété facultative sur true pour le message de demande sortant si le composant serveur doit traiter la demande de services web sous la même transaction que celle qui a été utilisée pour recevoir le message de la file d'attente ou du sujet de destination. Cette propriété est une extension de la spécification
SOAP pour JMS réalisée par IBM.
Pratiques recommandées: Pour les composants client, n'attribuez la valeur true à cette propriété que pour des demandes asynchrones unidirectionnelles ou bidirectionnelles de façon à éviter les problèmes de synchronisation pouvant survenir avec des demandes de services web synchrones bidirectionnelles. Si cette propriété n'est pas définie ou est définie à la valeur false par défaut, le serveur suspend la transaction utilisée pour recevoir le message de demande de la file d'attente ou du sujet de destination avant d'appeler le moteur de services Web pour traiter la demande.bprac
- SOAPJMS_requestURI : Cette propriété doit avoir pour valeur l'URL de noeud final JMS associée à la demande.
- SOAPJMS_soapAction : Cette propriété facultative est définie sur un message de demande JMS sortant pour indiquer la valeur soapAction associée à la demande de services web. Cette propriété est semblable à l'en-tête HTTP SOAPAction utilisé pour le transport des demandes de services web via HTTP. La valeur de la propriété soapAction est un URI identifiant l'objectif de la demande SOAP. Si la propriété SOAPJMS_soapAction est spécifiée, elle est utilisée par le composant serveur pour déterminer la cible de la demande. La spécification SOAP n'intègre aucune restriction en matière de format ou de spécificité de l'URI ou sur le fait qu'elle puisse être résolue. Généralement, cette propriété est définie sur la valeur soapAction à partir du document WSDL.
- SOAPJMS_targetService : Vous devez définir cette propriété sur un message de demande JMS sortant, et la valeur doit être associée à la valeur de propriété targetService présente dans l'URL du noeud final JMS de la demande. Cette valeur est utilisée par le composant serveur pour déterminer le composant de port auquel la demande est diffusée.
- SOAPJMS_bindingVersion : Cette propriété indique le numéro de version du protocole utilisé par le client et le serveur. Attribuez-lui la valeur 1.0.
- SOAPJMS_contentType : Cette propriété, similaire à l'en-tête Content-Type présent dans un message HTTP, sert à décrire le type de contenu du message. Un message SOAP en texte pur, par exemple un message sans pièces jointes, dispose de la valeur suivante définie pour cette propriété du message JMS :
- Si le message de demande SOAP est une demande bidirectionnelle, c'est-à-dire qu'une réponse est prévue, le composant client doit définir la propriété JMSReplyTo du message JMS afin de spécifier quelle file d'attente est utilisée pour le message de réponse. La méthode setJMSReplyTo du message JMS est utilisée pour spécifier la file d'attente. Il peut être bénéfique de configurer une file d'attente de réponses permanente sur le client pour que ce dernier n'ait pas à créer une file d'attente temporaire à chaque fois qu'une demande de services web est effectuée. Pour plus de détails sur la création de cette file d'attente spéciale, voir la configuration d'une file d'attente de réponses permanente pour des services web utilisant SOAP sur JMS.
- Si le message de demande SOAP est une demande unidirectionnelle, c'est-à-dire qu'un message de réponse n'est pas prévu, le composant client ne doit pas définir la propriété JMSreplyTo du message JMS.
- Le composant client peut considérer qu'un message de réponse est un objet BytesMessage JMS.
- Le composant client peut considérer que l'ID corrélation du message de réponse correspond à l'ID message de la demande d'origine.
- Le composant serveur peut s'attendre à recevoir un BytesMessage JMS. Si le composant serveur reçoit autre chose qu'un BytesMessage, une erreur avec le sous-code unsupportedJMSMessageFormat est renvoyée au client si une réponse est prévue.
- Le composant serveur peut s'attendre à recevoir un objet javax.jms.BytesMessage ou un objet javax.jms.TextMessage. Si le composant serveur reçoit autre chose qu'un objet BytesMessage ou TextMessage, le client reçoit un message d'erreur avec le sous-code unsupportedJMSMessageFormat s'il attend une réponse.
- Le composant serveur doit traiter la demande SOAP de manière adéquate de sorte à produire un message de réponse SOAP approprié.
- Le composant serveur ne doit envoyer un message de réponse au client que si la propriété JMSReplyTo du message de demande JMS est définie. La méthode getJMSReplyTo du message JMS permet de récupérer la valeur de propriété JMSReplyTo à partir du message JMS. Cette valeur indique la destination de la réponse.
- Quand le composant serveur envoie un message de réponse, il doit utiliser le même type de message que la requête. Si la requête reçue était un objet BytesMessage, la réponse doit également être du type BytesMessage. De même, si la requête reçue était un objet TextMessage, la réponse doit également être du type TextMessage.
- Le composant serveur doit définir les propriétés suivantes dans le message de réponse JMS avant de l'envoyer à la file d'attente de réponses :
- SOAPJMS_contentType : Cette propriété sert à décrire le type de contenu du message. Voir la description de cette propriété dans la section sur les responsabilités du client dans cette rubrique.
- correlation ID : La propriété de l'ID corrélation du message de réponse JMS doit être définie sur l'ID message du message de demande JMS d'origine. Cette corrélation est réalisée en appelant la méthode setJMSCorrelationID de message JMS.
- SOAPJMS_bindingVersion : Cette propriété indique le numéro de version du protocole utilisé par le client et le serveur. Attribuez-lui la valeur 1.0.
L'exemple suivant présente les résultats de l'appel de la méthode toString du message JMS pour un message de demande sans pièces jointes :
JMSMessage class: jms_bytes
JMSType: null
JMSDeliveryMode: 2
JMSExpiration: 0
JMSPriority: 4
JMSMessageID: null
JMSTimestamp: -1
JMSCorrelationID: null
JMSDestination: null
JMSReplyTo: queue://_Q_7D6C2035383215AB00000000000F4241?busName=WsFvtBus
JMSRedelivered: false
JMS_IBM_MsgType: 1
SOAPJMS_contentType: text/xml; charset=UTF-8
SOAPJMS_targetService: MaelstromWsEndpoint
SOAPJMS_requestIRI: jms:jndi:jms/MyRequestQueue?jndiConnectionFactoryName=jms/MyConnFactory&targetService=MyPort1
SOAPJMS_soapAction: "getQuote"
SOAPJMS_bindingVersion: 1.0
3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d38223f3e3c73
6f6170656e763a456e76656c6f706520786d6c6e733a736f6170656e763d22687474703a2f2f7363
68656d61732e786d6c736f61702e6f72672f736f61702f656e76656c6f70652f2220786d6c6e733a
7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61222078
...
JMSMessage class: jms_bytes
JMSType: null
JMSDeliveryMode: 2
JMSExpiration: 0
JMSPriority: 4
JMSMessageID: null
JMSTimestamp: -1
JMSCorrelationID: null
JMSDestination: null
JMSReplyTo: queue://_Q_F0940794C5CC2F84000000000044AA21?busName=WsFvtBus
JMSRedelivered: false
JMS_IBM_MsgType: 1
SOAPJMS_contentType: multipart/related;
boundary=MIMEBoundaryurn_uuid_B6BAFEADB1886ADC241205525550237;
type="text/xml"; start="<0.urn:uuid:B6BAFEADB1886ADC241205525550238@apache.org>"
SOAPJMS_targetService: MaelstromWsEndpoint
SOAPJMS_requestIRI: jms:jndi:jms/WebSvcsJMSQ?jndiConnectionFactoryName=
jms/WebSvcsJMS_CF&targetService=MaelstromWsEndpoint
SOAPJMS_soapAction: attachment
SOAPJMS_bindingVersion: 1.0
2d2d4d494d45426f756e6461727975726e5f757569645f4236424146454144423138383641444332
34313230353532353535303233370d0a436f6e74656e742d547970653a20746578742f786d6c3b20
636861727365743d5554462d380d0a436f6e74656e742d5472616e736665722d456e636f64696e67
3a20386269740d0a436f6e74656e742d49443a203c302e75726e3a757569643a4236424146454144
4231383836414443323431323035353235353530323338406170616368652e6f72673e0d0a0d0a3c
736f6170656e763a456e76656c6f706520786d6c6e733a736f6170656e763d22687474703a2f2f73
6368656d61732e786d6c736f61702e6f72672f736f61702f656e76656c6f70652f2220786d6c6e73
3a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220
786d6c6e733a7873693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368
656d612d696e7374616e63652220786d6c6e733a736f6170656e633d22687474703a2f2f73636865
...
JMSMessage class: jms_bytes
JMSType: null
JMSDeliveryMode: 2
JMSExpiration: 0
JMSPriority: 4
JMSMessageID: null
JMSTimestamp: 0
JMSCorrelationID: ID:cdddb857f078a266eb9a972f110a134f0000000000000001
JMSDestination: null
JMSReplyTo: null
JMSRedelivered: false
contentType:
multipart/related;
type="text/xml";
start="<961368106530.1092112854745.IBM.WEBSERVICES@yackerjr>";
boundary="----=_Part_0_1655006754.1092112854745"
0d0a2d2d2d2d2d2d3d5f506172745f305f313635353030363735342e313039323131323835343734
350d0a436f6e74656e742d547970653a20746578742f786d6c3b20636861727365743d5554462d38
...