第7章 WS-Reliable Messaging の使用

JBoss WS-CXF/CXF において 2 つのポイント間で信頼できるメッセージングを確立するには、CXF RM とアドレスインターセプタをインターセプタチェーンに追加する必要があります。これは、以下に示されたいずれかの方法で実現できます。
RMAssertion および CXF WS-Policy フレームワーク

RM インターセプタは、以下のことが行われた場合にポリシーフレームワークによって各インターセプタチェーンに自動的に追加されます。

  1. RMAssertion 要素を持つポリシーは wsdl:service 要素 (または、WS-Policy 添付のルールに従った、Policy または PolicyReference 要素の添付ポイントである他の WSDL 要素) に添付されます。
  2. CXF WS-Policy フレームワークが有効になります。
アサーション属性はソースまたは宛先の動作を制御します。たとえば、サーバーサイドで WS-Policy フレームワークを有効にする場合、設定ファイルは以下のようになります。
  
<jaxws:endpoint ...>
    <jaxws:features>
        <p:policies/>
    </jaxws:features>
</jaxws:endpoint>
WSDL は以下のようになります。
<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>
PolicyReference を wsdl:port 要素に添付する代わりに、含まれるポリシーの子要素 (サーバーエンドポイントなど) として指定できます。
 
<wsp:Policy wsu:Id="="RM" xmlns:wsp="http://www.w3.org/2006/07/ws-policy" ...>
</wsp:Policy>

<jaxws:endpoint ...>
  <jaxws:features> 
	<p:policies>
	  <wsp:PolicyReference URI="#RM" xmlns:wsp="http://www.w3.org/2006/07/ws-policy"/>
	</p:policies>
  </jaxws:features>
</jaxws:endpoint>
信頼できるメッセージング機能の使用

WS-Policy フレームワークを使用しない、シーケンス終了ポリシーや永続ストアなどの追加パラメータを設定しない場合は、ReliableMessaging 機能を使用できます。サポートされる子要素は以下のとおりです。

RMAssertion
タイプ RMAssertion の要素。
deliveryAssurance
適用すべき配信保証を定義するタイプ DeliveryAssuranceType の要素 (AtMostOnceAtLeastOnceInOrder)。
sourcePolicy
RM ソースの詳細 (オファーを CreateSequence 要求またはシーケンス終了ポリシーに常に含める必要があるかどうかなど) を設定できるタイプ SourcePolicyType の要素。
destinationPolicy
RM 宛先の詳細 (受信オファーを受け入れるかどうかなど) を設定できるタイプ DestinationPolicyType の要素。
ストア
使用するストア (デフォルト値: null)。これは、タイプ jdbcStore の要素 (同じネームスペース内)、Bean、または RMStore インターフェースを実装する Bean の参照である必要があります。
jbdcStore 要素タイプは以下のように定義されます。
以下の例はバスレベルで適用されます。
<cxf:bus>
    <cxf:features>
        <wsa:addressing/>
        <wsrm-mgr:reliableMessaging>
            <wsrm-policy:RMAssertion>
                <wsrm-policy:BaseRetransmissionInterval Milliseconds="4000"/>           
                <wsrm-policy:AcknowledgementInterval Milliseconds="2000"/>          
            </wsrm-policy:RMAssertion> 
            <wsrm-mgr:sourcePolicy>
                <wsrm-mgr:sequenceTerminationPolicy maxLength="5"/>                    
            </wsrm-mgr:sourcePolicy>     
            <wsrm-mgr:destinationPolicy acceptOffers="false">            
            <wsrm:store>
               <ref bean="myStore"/>
            </wsrm:store>
        </wsrm-mgr:reliableMessaging>
    </cxf:features>
</cxf:bus>
信頼できるメッセージングストアの設定

永続性を有効にするには、RM の永続ストアを実装するオブジェクトを指定する必要があります。独自のオブジェクトを開発したり、CXF に同梱される JDBC ベースのストア (class org.apache.cxf.ws.rm.persistence.jdbc.RMTxStore) を使用したりできます。JDBC ベースのストアは、カスタム jdbcStore Bean を使用して設定できます。サポートされる属性は以下の表に示されています。

表7.1 属性

属性名 文字列 デフォルト値
driverClassName 文字列 org.apache.derby.jdbc.EmbeddedDriver
userName 文字列 null
passWord 文字列 null
url 文字列 jdbc:derby:rmdb;create=true
例を以下に示します。
  <wsrm-mgr:jdbcStore id="myStore"
    driverClassName="org.apache.derby.jdbc.ClientDriver"
    url="jdbc:derby://localhost:1527/rmdb;create=true"
    password="password"/>
信頼できるメッセージングマネージャを手動で設定

RM マネージャのプロパティを設定するには、RMManager 要素を使用します。同じ子要素は上記の ReliableMessaging 機能としてサポートされます。たとえば、機能を使用せずに、以下のようにシーケンスが最大長を持つように決定できます。

<wsrm-mgr:rmManager xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager">
    <wsrm-mgr:sourcePolicy>
        <wsrm-mgr:sequenceTerminationPolicy maxLength="5"/>                    
    </wsrm-mgr:sourcePolicy>
</wsrm-mgr:rmManager>