SOAP over JMS 协议
Web Service 引擎支持使用符合新兴业界标准 SOAP over Java™ 消息服务 (JMS) 的消息传输代替 HTTP 在客户机与服务器之间传输 SOAP 消息。

IBM® 和其他供应商自 2005 年以来都一直致力于所建议 SOAP over JMS 规范的工作。已将规范提交到 W3C 且建立工作组。当前成员提交的此草案规范已于 2007 年 10 月联合发布。请参阅 SOAP over JMS 规范,以了解此业界标准的详细信息。
如果需要为客户机或服务器组件提供实现,请使用新兴的业界标准 SOAP over JMS 传输协议。您还需要确保这些实现可以与 WebSphere® Application Server 中 Web Service 引擎提供的客户机和服务器组件进行互操作。
在遵循以下协议约束的情况下,客户机组件负责发送 SOAP 请求消息和接收 SOAP 响应消息:
- 客户机必须使用 javax.jms.BytesMessage 对象或 javax.jms.TextMessage 对象将 SOAP 请求消息传送到服务器。
- 在将 JMS 请求消息发送到目标队列或主题之前,客户机必须对该消息设置下列属性:
- SOAPJMS_contentType:此属性与 HTTP 消息中出现的 Content-Type 头相似,用来描述消息的内容类型。纯文本 SOAP 消息(例如,不带附件的消息)为此 JMS 消息属性设置了以下值:
text/xml; charset="UTF-8"
对于包含附件的 SOAP 消息,请使用以下代码在 JMS 消息上设置 SOAPJMS_contentType 属性:
此示例表示一则多重部件消息,其中第一个部件类型为 text/xml 且包含 SOAP 包络。该多重部件消息的其他部件包含不同附件。HTTP 1.1 规范包含有关 Content-Type 头的更多信息。multipart/related; type="text/xml"; start="<...content-id_of_first_ part...>"
- enableTransaction:如果希望服务器组件在用于接收来自目标队列或主题的消息的同一事务下处理 Web Service 请求,请在出站 JMS 请求消息上将此可选属性设置为 true。此属性是 SOAP over JMS 规范的 IBM 扩展。
最佳实践: 对于客户机组件,仅针对单向或双向异步请求将此属性设置为 true,以避免出现有关双向同步 Web Service 请求的同步问题。如果此属性未设置或者设置为缺省值 false,那么在调用 Web Service 引擎以处理请求之前,服务器将暂挂用于接收来自目标队列或主题的请求消息的事务。bprac
- SOAPJMS_requestURI:必须将此属性设置为与请求关联的 JMS 端点 URL。
- SOAPJMS_soapAction:在出站 JMS 请求消息上设置此可选属性,以指示与 Web Service 请求关联的 soapAction 值。此属性类似于在通过 HTTP 传输来传输 Web Service 请求时所使用的 SOAPAction HTTP 头。soapAction 属性的值是一个标识 SOAP 请求的意图的 URI。如果已指定 SOAPJMS_soapAction 属性,那么服务器组件将使用它来确定请求的目标。SOAP 规范未对 URI 的格式或特异性作出任何限制,也未要求该 URI 是可解析的。通常,此属性设置为 WSDL 文档中的 soapAction 值。
- SOAPJMS_targetService:必须在出站 JMS 请求消息上设置此属性,且值必须与该请求的 JMS 端点 URL 中的 targetService 属性值相匹配。服务器组件会使用此值来确定请求所分派到的端口组件。
- SOAPJMS_bindingVersion:此属性指示客户机和服务器使用的协议的版本号。将值设为 1.0。
- SOAPJMS_contentType:此属性与 HTTP 消息中出现的 Content-Type 头相似,用来描述消息的内容类型。纯文本 SOAP 消息(例如,不带附件的消息)为此 JMS 消息属性设置了以下值:
- 如果请求消息表示双向请求(这意味着期望应答),那么客户机组件必须设置 JMS 消息 JMSReplyTo 属性以指定用于应答消息的队列。JMS 消息 setJMSReplyTo 方法用于指定队列。 在客户机上配置永久应答队列很有用,这样做可以使客户机不必在每次发出 Web Service 请求时创建临时队列。请阅读“使用 SOAP over JMS 配置 Web Service 的永久应答队列”,以获取有关创建此特殊队列的更多信息。
- 如果 SOAP 请求消息表示单向请求(这意味着不期望应答消息),那么客户机组件不可设置 JMS 消息 JMSReplyTo 属性。
- 客户机组件可以假设应答消息是一个 JMS BytesMessage 对象。
- 客户机组件可以假设应答消息相关标识与原始请求消息的消息标识相匹配。
在遵循以下协议约束的情况下,服务器组件负责接收 SOAP 请求消息和发送 SOAP 响应消息:
- 服务器组件可以期望接收到 JMS BytesMessage。如果服务器组件接收到的内容不是 BytesMessage,而且又期望应答,那么会将子代码为 unsupportedJMSMessageFormat 的故障返回到客户机。
- 服务器组件可以期望接收到 javax.jms.BytesMessage 对象或 javax.jms.TextMessage 对象。如果服务器组件接收到的内容不是 BytesMessage 或 TextMessage,而且又期望应答,那么会将子代码为 unsupportedJMSMessageFormat 的故障返回到客户机。
- 服务器组件必须正确处理 SOAP 请求,以产生适当的 SOAP 应答消息。
- 仅当设置了 JMS 请求消息的 JMSReplyTo 属性时,服务器组件才需要将应答消息发送回客户机。JMS 消息 getJMSReplyTo 方法用于从 JMS 消息检索 JMSReplyTo 属性值。此属性值指示应答目标。
- 发送应答消息时,服务器组件必须使用与请求相同的消息类型。如果请求是作为 BytesMessage 来接收,那么应答必须作为 BytesMessage 来发送。类似地,如果请求是作为 TextMessage 来接收,那么应答必须作为 TextMessage 来发送。
- 在将 JMS 应答消息发送到应答队列之前,服务器组件必须设置该消息中的下列属性:
- SOAPJMS_contentType:此属性用于描述消息的内容类型。请参阅本主题的客户机职责部分中对此属性的描述。
- correlation ID:将 JMS 应答消息的“相关标识”属性设置为原始 JMS 请求消息的消息标识。通过调用 JMS 消息的 setJMSCorrelationID 方法来完成此相关性。
- SOAPJMS_bindingVersion:此属性指示客户机和服务器使用的协议的版本号。将值设为 1.0。
对于不带附件的请求消息,以下示例显示了调用 JMS 消息的 toString 方法的结果:
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
...
对于带附件的请求消息,以下示例显示了调用 JMS 消息的 toString 方法的结果:
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
...
对于 SOAP 应答消息,以下示例显示了调用 JMS 消息的 toString 方法的结果:
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
...