Protokoll "SOAP over JMS"
Die Web-Service-Engine unterstützt die Verwendung eines JMS-kompatiblen (Java™ Message Service) Messaging-Transports als Alternative zu HTTP für die Übertragung von SOAP-Nachrichten zwischen Clients und Servern.

IBM® und andere Anbieter arbeiten seit 2005 an der vorgeschlagenen Spezifikation SOAP over JMS. Die Spezifikation wurde zur Prüfung an das World Wide Web Consortium (W3C) übergeben, und es wurde eine Arbeitsgruppe ins Leben gerufen. Ein gemeinsamer Entwurf dieses Dokuments wurde im Oktober 2007 veröffentlicht. Details zu diesem Branchenstandard finden Sie in der Spezifikation SOAP over JMS.
Verwenden Sie das neu entstehende standardisierte Transportprotokoll SOAP over JMS, wenn Sie Implementierungen für die Client- oder Serverkomponenten bereitstellen. Stellen Sie außerdem sicher, dass die Implementierungen mit den von der Web-Service-Engine in WebSphere Application Server bereitgestellten Client- und Serverkomponenten interagieren können.
- Der Client muss ein Objekt javax.jms.BytesMessage oder ein Objekt javax.jms.TextMessage für die Übertragung der SOAP-Anforderungsnachricht an den Server verwenden.
- Der Client muss die folgenden Eigenschaften in der JMS-Anforderungsnachricht setzen, bevor er die Nachricht
an die Zielwarteschlange bzw. das Zieltopic sendet:
- contentType: Diese Eigenschaft gleicht dem Header Content-Type in einer
HTTP-Nachricht und wird verwendet, um den Inhaltstyp der Nachricht zu beschreiben.
Eine reine SOAP-Textnachricht, z. B. eine Nachricht ohne Anhänge, hat den folgenden Wert für diese Eigenschaft der JMS-Nachricht:
text/xml; charset="UTF-8"
Verwenden Sie für eine SOAP-Nachricht mit Anhängen den folgenden Code, um die Eigenschaft SOAPJMS_contentType in dieser JMS-Nachricht zu setzen:
Dieses Beispiel bezieht sich auf eine mehrteilige Nachricht, in der der erste Teil den Typ text/xml hat und die SOAP-Rahmenanweisung enthält. Die anderen Teile der mehrteiligen Nachricht enthalten verschiedene Anhänge. Die Spezifikation HTTP 1.1 enthält weitere Informationen zum Header Content-Type.multipart/related; type="text/xml"; start="<...Inhalts-ID_des_ersten_Teils...>"
- enableTransaction: Setzen Sie diese optionale Eigenschaft für eine abgehende
JMS-Anforderungsnachrichten auf true, wenn die Serverkomponente
die Web-Service-Anforderung unter derselben Transaktion ausführen soll, die für den Empfang
der Nachricht aus der Zielwarteschlange oder dem Zieltopic verwendet wurde. Diese Eigenschaft
ist eine IBM Erweiterung der Spezifikation "SOAP over JMS".
Bewährtes Verfahren: Die Clientkomponente sollte diese Eigenschaft nur bei unidirektionalen oder bidirektionalen asynchronen Anforderungen auf true setzen, um Synchronisationsprobleme zu vermeiden, die bei bidirektionalen synchronen Web-Service-Anforderungen auftreten können. Wenn diese Eigenschaft auf den Standardwert false gesetzt ist, setzt der Server die Transaktion, die für den Empfang der Nachricht aus der Zielwarteschlange oder dem Zieltopic verwendet wurde, aus, bevor er die Web-Service-Engine zur Verarbeitung der Anforderung aufruft. bprac
- SOAPJMS_requestURI: Diese Eigenschaft muss auf den JMS-Endpunkt-URL gesetzt werden, der der Anforderung zugeordnet ist.
- SOAPJMS_soapAction: Diese optionale Eigenschaft wird für eine abgehende JMS-Anforderungsnachricht gesetzt und zeigt den soapAction-Wert an, der der Web-Service-Anforderung zugeordnet ist. Diese Eigenschaft ähnelt dem SOAPAction-HTTP-Header, der beim Transport von Web-Service-Anforderungen über einen HTTP-Transport verwendet wird. Der Wert der Eigenschaft soapAction ist ein URI, der den Zweck der SOAP-Anforderung angibt. Wenn die Eigenschaft SOAPJMS_soapAction angegeben ist, wird sie von der Serverkomponente verwendet, um das Ziel der Anforderung zu bestimmen. Die SOAP-Spezifikation schränkt das Format, die Genauigkeit oder Besonderheit des URI nicht ein und setzt auch nicht voraus, dass der URI auflösbar ist. Normalerweise wird diese Eigenschaft auf den soapAction-Wert des WSDL-Dokuments gesetzt.
- SOAPJMS_targetService: Diese Eigenschaft muss für eine abgehende JMS-Anforderungsnachricht gesetzt werden, und der Wert muss mit dem Wert der Eigenschaft targetService im JMS-Endpunkt-URL der Anforderung übereinstimmen. Dieser Wert wird von der Serverkomponente verwendet, um die Portkomponente zu bestimmen, an die die Anforderung verteilt wird.
- SOAPJMS_bindingVersion: Diese Eigenschaft gibt die Versionsnummer des vom Client und vom Server verwendeten Protokolls an. Setzen Sie den Wert zunächst auf 1.0.
- contentType: Diese Eigenschaft gleicht dem Header Content-Type in einer
HTTP-Nachricht und wird verwendet, um den Inhaltstyp der Nachricht zu beschreiben.
Eine reine SOAP-Textnachricht, z. B. eine Nachricht ohne Anhänge, hat den folgenden Wert für diese Eigenschaft der JMS-Nachricht:
- Wenn die Anforderungsnachricht eine bidirektionale Anforderung ist, d. h., wenn eine Antwort erwartet wird, muss die Clientkomponente in der Eigenschaft "JMSreplyTo" der JMS-Nachricht die Warteschlange angeben, die für die Antwortnachricht verwendet wird. Hierfür wird die Methode setJMSReplyTo der JMS-Nachricht verwendet. Es kann von Vorteil sein, eine permanente replyTo-Warteschlange auf dem Client zu konfigurieren, damit der Client nicht jedes Mal, wenn eine Web-Service-Anforderung abgesetzt wird, eine temporäre Warteschlange erstellen muss. Informationen zur Erstellung dieser speziellen Warteschlange finden Sie in den Artikeln, die sich mit der Konfiguration einer permanenten Antwortwarteschlange für Web-Services mit SOAP over JMS befassen.
- Wenn die SOAP-Anforderung eine unidirektionale Anforderung ist, d. h., wenn keine Antwort erwartet wird, darf die Clientkomponente die Eigenschaft "JMSReplyTo" der JMS-Nachricht nicht setzen.
- Die Clientkomponente kann voraussetzen, dass eine Antwortnachricht ein JMS-BytesMessage-Objekt ist.
- Die Clientkomponente kann davon ausgehen, dass die Korrelations-ID der Antwortnachricht mit der Nachrichten-ID der ursprünglichen Anforderungsnachricht übereinstimmt.
- Die Serverkomponente kann erwarten, dass eine empfangene Nachricht ein JMS-BytesMessage-Objekt ist. Empfängt die Serverkomponente keine BytesMessage, wird eine Fehlernachricht mit dem Untercode unsupportedJMSMessageFormat an den Client zurückgegeben, wenn eine Antwort erwartet wird.
- Die Serverkomponente kann den Empfang eines Objekts javax.jms.BytesMessage oder eines Objekts javax.jms.TextMessage erwarten. Empfängt die Serverkomponente keine BytesMessage- oder TextMessage-Nachricht, wird eine Fehlernachricht mit dem Untercode unsupportedJMSMessageFormat an den Client zurückgegeben, wenn eine Antwort erwartet wird.
- Die Serverkomponente muss die SOAP-Anforderung entsprechend verarbeiten, um die richtige SOAP-Antwortnachricht zu erzeugen.
- Die Serverkomponente muss nur dann eine Antwortnachricht an den Client zurücksenden, wenn die Eigenschaft "JMSReplyTo" der JMS-Anforderungsnachricht gesetzt ist. Die Methode getJMSReplyTo der JMS-Nachricht wird verwendet, um den Wert der Eigenschaft JMSReplyTo von der JMS-Nachricht abzurufen. Dieser Eigenschaftswert gibt das Antwortziel an.
- Beim Senden einer Antwortnachricht muss die Serverkomponente denselben Nachrichtentyp verwenden, den auch die Anforderung hat. Wenn die empfangene Anforderung eine BytesMessage-Nachricht war, muss die Antwort auch als BytesMessage-Nachricht gesendet werden. Wenn die empfangene Anforderung eine TextMessage-Nachricht war, muss die Antwort auch als TextMessage-Nachricht gesendet werden.
- Die Serverkomponente muss die folgenden Eigenschaften in der JMS-Antwortnachricht setzen, bevor sie
die Nachricht an die Antwortwarteschlange sendet:
- SOAPJMS_contentType: Diese Eigenschaft wird verwendet, um den Inhaltstyp der Nachricht zu beschreiben. Eine Beschreibung dieser Eigenschaft finden Sie im Abschnitt über die Verantwortlichkeiten des Clients in diesem Artikel.
- correlation ID: Diese Eigenschaft der JMS-Antwortnachricht muss auf die Nachrichten-ID der ursprünglichen JMS-Anforderungsnachricht gesetzt werden. Hierzu wird die Methode setJMSCorrelationID der JMS-Nachricht aufgerufen.
- SOAPJMS_bindingVersion: Diese Eigenschaft gibt die Versionsnummer des vom Client und vom Server verwendeten Protokolls an. Setzen Sie den Wert zunächst auf 1.0.
Das folgende Beispiel zeigt die Ergebnisse des Aufrufs der Methode toString der JMS-Nachricht für eine Anforderungsnachricht ohne Anhänge:
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
...