21.3. 启用 WS-RM
概述 复制链接链接已复制到粘贴板!
要启用可靠的消息传递,WS-RM 拦截器必须添加到入站和出站消息和故障的拦截器链中。由于 WS-RM 拦截器使用 WS-Addressing,所以 WS-Addressing 拦截器也必须存在于拦截器链中。
您可以通过以下两种方式之一来确保存在这些拦截器:
Spring Bean:显式添加拦截器 复制链接链接已复制到粘贴板!
要启用 WS-RM 和 WS-Addressing 拦截器到 Apache CXF 总线,或使用 Spring bean 配置添加到消费者或服务端点。这是在 InstallDir/samples/ws_rm 目录中的 WS-RM 示例中采用的方法。配置文件 ws-rm.cxf 显示了 WS-RM 和 WS-Addressing 拦截器作为 Spring Bean(请参阅 例 21.1 “使用 Spring Beans 启用 WS-RM”
例 21.1. 使用 Spring Beans 启用 WS-RM
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/
beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mapAggregator" class="org.apache.cxf.ws.addressing.MAPAggregator"/>
<bean id="mapCodec" class="org.apache.cxf.ws.addressing.soap.MAPCodec"/>
<bean id="rmLogicalOut" class="org.apache.cxf.ws.rm.RMOutInterceptor">
<property name="bus" ref="cxf"/>
</bean>
<bean id="rmLogicalIn" class="org.apache.cxf.ws.rm.RMInInterceptor">
<property name="bus" ref="cxf"/>
</bean>
<bean id="rmCodec" class="org.apache.cxf.ws.rm.soap.RMSoapInterceptor"/>
<bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl">
<property name="inInterceptors">
<list>
<ref bean="mapAggregator"/>
<ref bean="mapCodec"/>
<ref bean="rmLogicalIn"/>
<ref bean="rmCodec"/>
</list>
</property>
<property name="inFaultInterceptors">
<list>
<ref bean="mapAggregator"/>
<ref bean="mapCodec"/>
<ref bean="rmLogicalIn"/>
<ref bean="rmCodec"/>
</list>
</property>
<property name="outInterceptors">
<list>
<ref bean="mapAggregator"/>
<ref bean="mapCodec"/>
<ref bean="rmLogicalOut"/>
<ref bean="rmCodec"/>
</list>
</property>
<property name="outFaultInterceptors">
<list>
<ref bean="mapAggregator">
<ref bean="mapCodec"/>
<ref bean="rmLogicalOut"/>
<ref bean="rmCodec"/>
</list>
</property>
</bean>
</beans>
例 21.1 “使用 Spring Beans 启用 WS-RM” 中显示的代码可以按照以下方式解释:
Apache CXF 配置文件是一个 Spring XML 文件。您必须包含一个打开的 Spring Bean 元素,用于声明由 Bean 元素封装的子元素的命名空间和架构文件。
配置每个 WS-Addressing interceptors-MAPAggregator 和 MAPCodec。有关 WS-Addressing 的详情,请参考 第 20 章 部署 WS-Addressing。
配置每个 WS-RM 拦截器-RMOutInterceptor、RMInInterceptor 和 RMSoapInterceptor。
将 WS-Addressing 和 WS-RM 拦截器添加到入站消息的拦截器链中。
将 WS-Addressing 和 WS-RM 拦截器添加到入站故障的拦截器链中。
将 WS-Addressing 和 WS-RM 拦截器添加到出站消息的拦截器链中。
将 WS-Addressing 和 WS-RM 拦截器添加到出站故障的拦截器链中。
WS-Policy 框架:隐式添加拦截器 复制链接链接已复制到粘贴板!
WS-Policy 框架提供了您可使用 WS-Policy 的基础架构和 API。它符合 2006 年 11 月发布的 Web 服务策略 1.5-Framework 和 Web 服务策略 1.5-Attachment 规格。
要使用 Apache CXF WS-Policy 框架启用 WS-RM,请执行以下操作:
在您的客户端和服务器端点中添加策略功能。例 21.2 “使用 WS-Policy 配置 WS-RM” 显示在
jaxws:feature元素内嵌套的参考。referencean 指定AddressingPolicy,它定义为同一配置文件内的独立元素。例 21.2. 使用 WS-Policy 配置 WS-RM
<jaxws:client> <jaxws:features> <ref bean="AddressingPolicy"/> </jaxws:features> </jaxws:client> <wsp:Policy wsu:Id="AddressingPolicy" xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata"> <wsam:Addressing> <wsp:Policy> <wsam:NonAnonymousResponses/> </wsp:Policy> </wsam:Addressing> </wsp:Policy>向
wsdl:service元素或任何其他 WSDL 元素添加可靠的消息传递策略,它们可用作策略或策略参考元素附加到 WSDL 文件的附件点,如 例 21.3 “在您的 WSDL 文件中添加 RM 策略” 所示。例 21.3. 在您的 WSDL 文件中添加 RM 策略
<wsp:Policy wsu:Id="RM" xmlns:wsp="http://www.w3.org/2006/07/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata"> <wsp:Policy/> </wsam:Addressing> <wsrmp:RMAssertion xmlns:wsrmp="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"> <wsrmp:BaseRetransmissionInterval Milliseconds="10000"/> </wsrmp:RMAssertion> </wsp:Policy> ... <wsdl:service name="ReliableGreeterService"> <wsdl:port binding="tns:GreeterSOAPBinding" name="GreeterPort"> <soap:address location="http://localhost:9020/SoapContext/GreeterPort"/> <wsp:PolicyReference URI="#RM" xmlns:wsp="http://www.w3.org/2006/07/ws-policy"/> </wsdl:port> </wsdl:service>