WS-RX 和 WS-Polling 的关系
WS-Reliable Exchange (WS-RX) OASIS Technical Committee 最近发布了 Web 服务可靠消息传递(WS-ReliableMessaging,WS-RM)规范,以供公众进行公开评审。在本文中,Doug Davis 讨论了新规范如何处理向无法接受传入连接的端点交付 SOAP 消息的问题,并分析了其与 WS-Polling 规范的重叠功能。
WS-RM 的解决方案
在前一部分中,我们讨论了接收端点(能够发起连接的端点)必须如何负责建立每个新连接。通常,这被视为“轮询”,因为该端点向其他端点查询消息。虽然 WS-RM 规范的确定义了可供目标端点用作创建新连接的根据的机制,但务必要理解此操作不是轮询消息。这个重要的概念对理解 WS-RM 如何解决此问题非常关键。
在了解为何术语“轮询”并不合适前,我们将对 WS-RM 规范定义的内容进行分析。首先,WS-RM 规范定义了一个新的 URI 模板:
清单 1. 新的 URI 模板
| http://docs.oasis-open.org/ws-rx/wsrm/200608/anonymous?id={uuid} |
此 URI 是一个“模板”,因为使用它时,“{uuid}”将被替换为唯一的 UDDI,从而允许此 URI 可与此 URI 的其他实例唯一地区分开来。不过,无论 uuid 的值如何,此 URI 的语义含义将保持不变。此 URI 用于两个目的。首先,它具有与 WS-Addressing 匿名 URI 相同的语义含义。也就是说,当在 wsa:ReplyTo 之类端点引用(Endpoint Reference,EPR)中使用时,就意味着任何响应消息都应发送回传输特定的回发通道(或者,对于 HTTP 的情况则是 HTTP 响应流)。这通常用于同步请求-响应消息交换。
此 URI 的第二个语义含义则是在原始传输特定回发通道不可用时发挥作用(例如,连接已断开时)。在这些情况下,此 URI 唯一地标识创建原始连接的端点。或者,换个说法,当原始传输特定的回发通道不再可用时,服务可以保留任何以此 URI 为目的地的消息,直到创建了来自同一请求端点的新连接为止,并随后通过新连接的回发通道将消息返回。如果使用了静态 WS-Addressing 匿名 URI,则 URI 中将不包含可用于区分各个“匿名”端点的唯一标识信息。
其次,WS-RM 规范定义了一个新的单向操作,端点可以发送此操作来创建新连接:
清单 2. 新的单向操作
| <soap:Envelope ...> <soap:Header <wsa:To> some service </wsa:To> <wsa:Action> http://...wsrx.../MakeConnection </wsa:Action> </soap:Header> <soap:Body> <wsrm:MakeConnection ...> <wsrm:Address ...> xs:anyURI </wsrm:Address> </wsrm:MakeConnection> </soap:Body> </soap:Envelope> |
在我们的场景中,防火墙后的端点(请求方)将使用此消息,并指定一个 wsrm:Address 元素作为 wsrm:MakeConnection 元素的子项,其中包含标识消息的发起方的 URI;也就是说,它通常将包含一个 WS-RM 匿名 URI 模板(如上面所定义的)。接收此消息的端点将随后可以使用传输特定的回发通道自由地发送以此 URI 为目标的任何消息。虽然此消息交换的结果是请求方发起了一个连接且相应的消息被发回,但务必注意,请求方并不轮询消息。现在我们将分析为何这个差别如此重要。
首先,我们需要理解 MakeConnection 操作为何是单向操作,而不是请求-响应消息交换。根据通常的 WS-Addressing 请求-响应处理规则,请求-响应消息交换中的请求消息应该包含 wsa:ReplyTo EPR(或缺省设置为“anonymous”)。此 EPR 将随后用于两个目的:1) 作为响应消息的 [destination] EPR;2) 响应消息将发送到此 EPR。
……
- 本文关键词:

