21.3. WS-RM の有効化
概要
信頼性の高いメッセージングを有効にするには、インバウンドとアウトバウンドの両方のメッセージと障害のインターセプターチェーンに WS-RM インターセプターを追加する必要があります。WS-RM インターセプターは WS-Addressing を使用するため、WS-Addressing インターセプターもインターセプターチェーンに存在する必要があります。
これらのインターセプターの存在を確認するには、次の 2 つの方法のいずれかを使用します。
Spring beans: 明示的にインターセプターを追加する
WS-RM を有効にするには、WS-RM および WS-Addressing インターセプターを Apache CXF バス、または Spring bean 設定を使用するコンシューマーまたはサービスエンドポイントに追加します。これは、InstallDir/samples/ws_rm
ディレクトリーにある WS-RM サンプルで取得した手法です。設定ファイル ws-rm.cxf
では、WS-RM と WS-Addressing インターセプターが Spring Bean として 1 つずつ追加されています (例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 ファイルです。beans
要素によってカプセル化される子要素の namespace およびスキーマファイルを宣言するオープニング Spring beans
要素を含める必要があります。
各 WS-Addressing インターセプター (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 を提供します。これは、Web サービスポリシー 1.5- フレームワーク および Web サービスポリシー 1.5- 添付ファイル の仕様の 2006 年 11 月のドラフト公開に準拠しています。
Apache CXF WS-Policy フレームワークを使用して WS-RM を有効にするには、次の手順を実行します。
ポリシー機能をクライアントとサーバーのエンドポイントに追加します。例21.2「WS-Policy を使用した WS-RM の設定」 は、
jaxws:feature
要素内にネストされた参照 Bean を表示します。参照 Bean は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>
例21.3「WSDL ファイルへの RM ポリシーの追加」 に示すように、信頼できるメッセージングポリシーを
wsdl:service
要素またはポリシー参照要素として使用できる他の WSDL 要素に追加します。例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>