龚 豫鄂 (gongyue@cn.ibm.com), 软件工程师,
IBM
王袁 希儿 (wangxi0617@sina.com), IBM 实习生,
IBM
2008 年 5 月 15 日 在 第 1 部分 中我们介绍了如何开发基于 JAX-WS 的 Web Services,本文将在此基础上介绍如何在 WebSphere Application Server(WAS) v6.1 上通过策略集的配置实现可靠的消息传输。本文首先介绍 WS-Reliable Messaging 规范,然后再介绍在 WAS6.1 具体的配置过程。
WS-Reliable Messaging
在 WS-Reliable Messaging v1.0 中收发双方的消息示例流程如下:
-
首先有发送方 A 发起整个消息序列的建立过程。在 SOAP 报文中,会有 CreateSequence 元素;
-
收到该消息后,接收方 B 发送消息序列建立回应,在报文中出现 CreateSequenceResponse 元素;
-
接着发送方发送了 3 条消息,其 MessageNumber 分别为 1,2,3。其中第二条消息丢失了。
-
当 B 收到消息 1 和 3 后,向 A 回复 SequenceAcknowledgement,并指定
AcknowledgementRange=1,3,这就说明在传输的过程中消息 2 丢失了;
-
A 重新发送消息 2;
-
B 收到消息 2 后,发送 SequenceAcknowledgement 并指定 AcknowledgementRange=1…3,这就说明从消息 1 到消息 3 已经全部收到;
-
最后 A 在收到所有回应消息后,结束消息序列,TerminateSequence。
在 WS-Reliable Messaging v1.1 中,消息可靠传输的机制又有所不同,尤其是针对同步双向的消息传输,使用了 MakeConnection 机制。该机制中,接收方根据 MakeConnection 消息中提供的地址进行回复,但在 WS-ReliableMessaging v1.0 中并不支持该机制。由于本文中使用标准 WS-Reliable Messaging v1.0,因此关于 WS-Reliable Messaging v1.1 的具体内容就不再一一赘述,更多详细信息可以参考在本文最后提供的参考资料。
第一步:配置可靠消息传输的策略集
在 WAS6.1 中可以使用 policy set 的绑定机制来实现服务质量。为了能够使用策略集,需要安装 feature pack for web service 补丁包。启动 WAS6.1 服务器,在控制台上选择服务 -> 策略集 -> 应用策略集,在右边的窗口中将显示出 WAS6.1 中所有的策略集。点击新建一个策略集 testplicy。
在新建的策略集对话框中输入策略集的名字:testpolicy,点击确定。
将修改保存后在页面最下方,我们可以看到新建的策略集。通过比较可以看出 WAS6.1 自带的策略集的属性是“只读”而我们新建的策略集是可编辑的。
点击新建的策略集 testpolicy 对其进行编辑。在策略下面点击添加,并选择我们需要的策略类型,为了保证可靠消息传输,我们应选择 WS-Reliable Messaging 和 WS-Addressing 两个策略。
WS-Reliable Messaging 提供将消息可靠地传递至其预期接收方的能力。WS-Addressing 提供一种与传输无关的方法来统一地确定 Web Service 和消息的地址。
点击 WS-ReliableMessaging 进行具体的可靠消息策略的配置。
选择使用的 WS-Reliable Messaging 标准版本:WS-Reliable Messaging v1.0。
此外,在 WAS6.1 中提供了以下三种不同类型的服务质量:
-
非受管非持久:通过一个默认的在内存中的存储空间来实现消息的可靠传输。这种模式需求最少的配置,但只能用于单个服务器不支持服务器集群。这种方式使得在网络出现故障时仍然可以进行消息的重发,但是服务器的故障会导致消息丢失。此外该服务质量不支持 z/OS 平台。
-
受管非持久:这种内存中的服务质量同时支持服务器集群和单个服务器。他使用消息引擎来管理消息的序列状态(sequence state),当内存不足时使用硬盘来存储消息。在网络故障和服务器故障时都保证了消息不会丢失。但是消息引擎的故障会导致消息丢失。
-
受管持久:这种异步 Web Services 调用的服务质量是可恢复的。同样使用消息引擎和消息存储空间来管理消息的序列状态。消息在服务提供方和请求方的服务器上都是持续的,在服务器故障时也可以恢复。在服务器故障时未成功传输的消息可以在服务器重启后可以继续传输。
如果此处选择非受管非持久的服务质量则我们的策略集配置就完成了。直接转到第二步进行策略集绑定即可。
如果使用受管的服务质量则还需要为服务器添加总线和消息引擎。服务集成总线支持使用基于消息和面向服务体系结构的应用程序。总线是一组互相连接的服务器和集群,它们已添加为总线的成员。应用程序在其总线成员关联的某个消息传递引擎上连接到总线。消息传递引擎是管理总线成员的消息传递资源的组件,在服务器内运行。应用程序在访问服务集成总线时连接到消息传递引擎。
选择服务集成 -> 总线 -> 新建,输入总线名称“mytestbus”,单击下一步完成,并保存设置。
选择“下一步”
选择“完成”。mytestbus 总线创建完毕。
然后点击总线 mytestbus 对其进行编辑
选择拓扑 -> 总线成员 -> 添加,进行总线成员的添加。总线成员是已添加到总线的服务器、WebSphere MQ Server 和集群。
选择“服务器”,并点击“下一步”。
文件存储器意味着消息会持久化到文件系统;而数据存储器则意味着消息会持久化到数据库。选择“文件存储器”,并点击“下一步”。
选择“下一步”
选择“完成”。
选择服务集成 -> 总线 -> mytestbus -> 总线成员 -> 消息传递引擎,可以看到 WAS6.1 已经自动添加了消息传递引擎。
选择服务 -> 策略集 -> 缺省策略集绑定WS-Reliable Messaging,为我们的可靠消息传递服务绑定总线和消息传递引擎。分别在总线名和消息传递引擎处选择我们新添加的总线和消息引擎即可。单击确定并保存设置。
第二步:实现 WS-ReliableMessaging
在建立好策略集以后,需要将策略集与应用程序进行绑定才能生效。在控制台中选择应用程序 -> 企业应用程序,点击 ClientEAR 项目,在右边的 Web Services 属性下选择服务客户机策略集和绑定,选择应用程序 ClientEAR,点击绑定,在下拉菜单中选择策略集 testpolicy。
可以看到当选择在应用程序层绑定一个策略集后,其下面的每个层:服务,端点以及操作都被绑定了同样的策略集,而且是继承的。点击保存设置。
对于服务提供方的项目 ServicesEAR 按照同样的步骤绑定这个策略集。但是在对服务提供方进行绑定时,应注意与服务客户机策略集和绑定对应的服务提供方选择支应该是服务提供者策略集和绑定(service provider policy sets and bindings)。点击保存我们的配置。到此便完成了消息可靠传输的配置工作。
第三步:报文监测
最后我们在 TCP/IP 监视器中查看报文。TCP/IP 监视器的配置请参考第一部分的“报文监测”。可以看到一共监测到了 5 条报文,反映了 WS-Reliable Messaging v1.0 的协议流程。第一条报文是客户端程序请求建立消息序列,该报文的特征是 body 中含有 wsrm:CreateSequence 元素。wsa 元素表示我们起用了 WS-Addressing 机制。具体报文如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsa:To>http://localhost:9090/Services/CalculatorService</wsa:To>
<wsa:MessageID>urn:uuid:1D24784FA504F2842A1188808922479</wsa:MessageID>
<wsa:Action>http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence</wsa:Action>
</soapenv:Header>
<soapenv:Body>
<wsrm:CreateSequence xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm">
<wsrm:AcksTo>
<wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
</wsrm:AcksTo>
<wsrm:Offer>
<wsrm:Identifier>urn:uuid:1D24784FA504F2842A1188808922480</wsrm:Identifier>
</wsrm:Offer>
</wsrm:CreateSequence>
</soapenv:Body>
</soapenv:Envelope>
|
第二条为服务提供者回复序列建立报文,该报文含有 CreateSequenceResponse 元素,报文如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsa:MessageID>urn:uuid:1D24784FA504F2842A1188808922781</wsa:MessageID>
<wsa:Action>http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:1D24784FA504F2842A1188808922479</wsa:RelatesTo>
</soapenv:Header>
<soapenv:Body>
<wsrm:CreateSequenceResponse xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm">
<wsrm:Identifier>urn:uuid:1D24784FA504F2842A1188808922780</wsrm:Identifier>
<wsrm:Accept>
<wsrm:AcksTo>
<wsa:Address>http://localhost:9090/Services/CalculatorService</wsa:Address>
</wsrm:AcksTo>
</wsrm:Accept>
</wsrm:CreateSequenceResponse>
</soapenv:Body>
</soapenv:Envelope>
|
第三条报文中看到数据参数 a,b 的传输,从报文中可以看到消息的 Identifier 为
urn:uuid:1D24784FA504F2842A1188808922780。发送报文如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsrm:Sequence xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"
soapenv:mustUnderstand="1">
<wsrm:Identifier>urn:uuid:1D24784FA504F2842A1188808922780</wsrm:Identifier>
<wsrm:MessageNumber>1</wsrm:MessageNumber>
</wsrm:Sequence>
<wsa:To>http://localhost:9090/Services/CalculatorService</wsa:To>
<wsa:MessageID>urn:uuid:1D24784FA504F2842A1188808922476</wsa:MessageID>
<wsa:Action>add</wsa:Action>
</soapenv:Header>
<soapenv:Body>
<dlwmin:add xmlns:dlwmin="http://services.ws.ibm.com">
<a>52</a>// 参数 a 值
<b>24</b>// 参数 b 值
</dlwmin:add>
</soapenv:Body>
</soapenv:Envelope>
|
可以看到这是我们的消息序列中的第一条消息,其 MessageNumber 为 1,Identifier 值为 urn:
uuid:1D24784FA504F2842A1188808922780。
服务提供者响应如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsrm:SequenceAcknowledgement xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"
soapenv:mustUnderstand="1">
<wsrm:Identifier>urn:uuid:1D24784FA504F2842A1188808922780</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="1"/>
</wsrm:SequenceAcknowledgement>
<wsrm:Sequence xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"
soapenv:mustUnderstand="1">
<wsrm:Identifier>urn:uuid:1D24784FA504F2842A1188808922480</wsrm:Identifier>
<wsrm:MessageNumber>1</wsrm:MessageNumber>
</wsrm:Sequence>
<wsa:MessageID>urn:uuid:1D24784FA504F2842A1188808923039</wsa:MessageID>
<wsa:Action>http://services.ws.ibm.com/Calculator/addResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:1D24784FA504F2842A1188808922476</wsa:RelatesTo>
</soapenv:Header>
<soapenv:Body>
<ns2:addResponse xmlns:ns2="http://services.ws.ibm.com"/>
</soapenv:Body>
</soapenv:Envelope>
|
可以看到本条消息是对上一条服务调用消息的回复,因此消息中 SequenceAcknowledge 元素下 MessageNumber 值为 1,Identifier 值为 urn:uuid:1D24784FA504F2842A1188808922780。同时本条消息又是这个消息序列中服务提供者向客户及发送的第一条消息,其 Identifier 为 urn:uuid: 1D24784FA504F2842A1188808922480。因此,服务提供方要等待客户机的一个确认消息。
最后客户端发送接受确定报文,与收到的服务响应报文一样,该报文的 Identifier 为 urn:uuid: 1D24784FA504F2842A1188808922480:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsrm:SequenceAcknowledgement xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"
soapenv:mustUnderstand="1">
<wsrm:Identifier>urn:uuid:1D24784FA504F2842A1188808922480</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="1"/>
</wsrm:SequenceAcknowledgement>
<wsa:To>http://localhost:9090/Services/CalculatorService</wsa:To>
<wsa:MessageID>urn:uuid:1D24784FA504F2842A1188808923131</wsa:MessageID>
<wsa:Action>http://schemas.xmlsoap.org/ws/2005/02/rm/SequenceAcknowledgement</wsa:Action>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
|
到此,可靠的 Web Services 就开发完成了。尝试停止服务提供方应用程序,再调用 Web Services 可以发现服务器会不断的重发请求消息,直到重新启动服务提供方。
结束语
WS-Reliable Message 确保 Web Services 消息传递到目的地,如果消息丢失则通过再次传递杜绝消息丢失。此规范使发送方和接收方能够保证一组消息中的服务质量。它有助于应用程序开发者处理旧问题、维护中断和阻碍消息完成的其他问题。通过本文,您可以对 WS-Reliable Messaging 规范有一个初步的了解,并懂得如何通过在 WebSphere Application Server(WAS) v6.1 上通过策略集的配置实现可靠的消息传输。您可以通过本文提供的参考资源获得更多关于 WS-Reliable Messaging 的信息
参考资料 学习
获得产品和技术
讨论
作者简介  | |  | 龚豫鄂目前在 IBM 中国软件开发中心实验室服务部门工作,在 Java和 Web 开发方面有丰富的经验,对J2EE、SOA和网格计算等技术有深入的研究。现在正从事电子商务、物流和供应链管理解决方案的开发和支持工作,你可以通过gongyue@cn.ibm.com与他联系。 |
 | |  | 王袁希儿 中国科学院研究生院硕士研究生,目前在IBM CSDL实习,主要从事web service方面的学习和工作 ,学生期间一直从事信息安全方面的理论研究,对工程的开发有着浓厚的兴趣和热情。闲散时间喜欢旅游、轮滑和游泳。您可以通过wangxi0617@sina.com与她联系。 |
对本文的评价
|