Chapter 7. Using WS-Reliable Messaging
The RM interceptors will be automatically added to their respective interceptor chains by the policy framework if the following occurs:
- A Policy with an RMAssertion element is attached to the
wsdl:service
element (or any other WSDL element that is an attachment point for Policy or PolicyReference elements according to the rules for WS-Policy Attachments). - The CXF WS-Policy Framework is enabled
<jaxws:endpoint ...> <jaxws:features> <p:policies/> </jaxws:features> </jaxws:endpoint>
<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>
wsdl:port
element, you can also specify it as a child element of the policies featured, such as the server endpoint.
<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>
You can use the ReliableMessaging feature if you do not want to involve the WS-Policy Framework, or want to configure additional parameters such as the sequence termination policy or the persistent store. The supported child elements are listed below.
- RMAssertion
- An element of type RMAssertion.
- deliveryAssurance
- An element of type DeliveryAssuranceType that describes the delivery assurance that should apply (
AtMostOnce
,AtLeastOnce
,InOrder
). - sourcePolicy
- An element of type SourcePolicyType that allows you to configure details of the RM source, such as whether an offer should always be included in a
CreateSequence
request, or the sequence termination policy. - destinationPolicy
- An element of type DestinationPolicyType that allows you to configure details of the RM destination, such as whether inbound offers should be accepted.
- store
- The store to use (default:
null
). This must be an element of type jdbcStore (in the same namespace), or a bean or a reference to a bean that implements the RMStore interface.
<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>
To enable persistence, you must specify the object implementing the persistent store for RM. You can develop your own, or use the JDBC based store that comes with CXF (class org.apache.cxf.ws.rm.persistence.jdbc.RMTxStore
). You can configure the latter using a custom jdbcStore bean. The supported attributes are in the table below.
Table 7.1. Attributes
Attribute name | String | Default |
---|---|---|
driverClassName | String | org.apache.derby.jdbc.EmbeddedDriver |
userName | String | null |
passWord | String | null |
url | String | 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"/>
To configure properties of the RM Manager, you can use the RMManager element. It supports the same child elements as the ReliableMessaging feature element above. For example, without using features, you can determine that sequences should have a maximum length of five as follows:
<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>