Using WS-Reliable Messaging
...
To make a message exchange between two endpoints reliable, you need to ensure that the RM interceptors and (as WS-Reliable messaging has a dependency on WS-Addressing) the addressing interceptors are added to the interceptor chains. This can be achieved in one of the following ways:
Using the RMAssertion and the CXF WS-Policy Framework
If
- A Policy with an RMAssertion element is attached to the wsdl:service element (or any other wsdl element that according to the rules for WS-Policy Attachment is an attachment point for Policy or PolicyReference elements)
...
- The CXF WS-Policy Framework
...
- is enabled
...
...
the RM interceptors will be automatically added to their respective interceptor chains by the policy framework. The assertion attributes control the behavior of the source/destination.
For example, to enable the WS-Policy Framework on the server side, you configuration file could look like this
The attachment of a <wsp:Policy> element containing an <wsrmp:RMAssertion> element (or a <wsp:PolicyReference element referencing such an element) is then sufficient to enable the use of Reliable Messaging, i.e. it causes the Reliable Messaging interceptors to be added to the appropriate interceptor chains.
While an empty <RMAssertion> element is enough to trigger the use of reliable Messaging. Any child elements, such as an <wsrmp:BaseRetransmissionInterval> element, will take effect only for the endpoint to which the enclosing <wsp:Policy> od <wsp:PolicyReference> element applies.
Note that the <wsp:Policy> or <wsp:PolicyReference> elements need not be necessarily be attached to wsdl elements but can also appear in the form of external attachments, see WS-Policy - How it Works.
Enabling WS-Reliable Messaging using the WS-Policies Feature
The PolicyEngine can also be enabled by using the WS-Policies Feature - that way you need not be aware of the policy engine's implementation class and its relation to the bus:
Code Block | ||||
---|---|---|---|---|
| ||||
<jaxws:endpoint ...> <jaxws:features> <p:policies/> </jaxws:features> </bean> Also, <wsp:Policy> or <wsp:PolicyReference> element can appear as child elements of the policies feature, having the same effect as if they were attached to the wsdl:element representing the endpoint: {code:xml} <jaxws:endpoint ...jaxws:endpoint> |
and your wsdl:
Code Block | ||||
---|---|---|---|---|
| ||||
<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"> <jaxws<wsrmp:features> BaseRetransmissionInterval Milliseconds="10000"/> </wsrmp:RMAssertion> </wsp:Policy> ... <wsdl:service name="ReliableGreeterService"> <p:policies xmlns:p="<wsdl:port binding="tns:GreeterSOAPBinding" name="GreeterPort"> <soap:address location="http://localhost:9020/SoapContext/GreeterPort"/> <wsp:PolicyPolicyReference URI="#RM" xmlns:wsp="http://www.w3.org/2006/07/ws-policy"/> </wsdl:port> </wsdl:service> |
Instead of attaching the PolicyReference attached to the wsdl:port element, you can also specify it as a child element of the policies features, e.g. for the server endpoint:
Code Block | ||||
---|---|---|---|---|
| ||||
<wsp:Policy wsu:Id="RM" xmlns:wsp="http://www.w3.org/2006/07/ws-policy" ...> </wsp:Policy> <jaxws:endpoint ...> <wsp<jaxws:All>features> <p:policies> <wsp:PolicyReference <wsam:Addressing URI="#RM" xmlns:wsamwsp="http://www.w3.org/20072006/07/ws-policy"/> </p:policies> </jaxws:features> </jaxws:endpoint> |
As of CXF 3.0.0 both the older WS-ReliableMessagingPolicy 1.0 (submission version) and the official WS-ReliableMessagingPolicy 1.2 are supported. WS-ReliableMessagingPolicy 1.2 must be used in the policy if you want WS-ReliableMessaging 1.2 support at runtime.
Using the Reliable Messaging Feature
If you don't want to involve the WS-Policy Framework, or want to configure additional parameters such as the sequence termination policy or the persistent store, you can use the reliableMessaging feature. It is defined in namespace http://cxf.apache.org/ws/rm/manager and supports the following child elements:
Name | Value |
---|---|
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. |
For details about the element types used in this namespace please refer to the schemas for the http://cxf.apache.org/ws/rm/manager namespace (http://cxf.apache.org/schemas/configuration/wsrm-manager.xsd and http://cxf.apache.org/schemas/configuration/wsrm-manager-types.xsd). The jbdcStore element type is described below.
Example (feature applied at bus level):
Code Block | ||||
---|---|---|---|---|
| ||||
<cxf:bus> <cxf:features> 02/addressing/metadata"> <wsa:addressing/> <wsp:Policy/><wsrm-mgr:reliableMessaging> <wsrm-policy:RMAssertion> </wsam:Addressing> <wsrm-policy:BaseRetransmissionInterval Milliseconds="4000"/> <wsrmp<wsrm-policy:RMAssertionAcknowledgementInterval xmlns:wsrmpMilliseconds="http://schemas.xmlsoap.org/ws/2005/02/rm/policy">2000"/> </wsrm-policy:RMAssertion> <wsrm-mgr:sourcePolicy> <wsrmp<wsrm-mgr:BaseRetransmissionIntervalsequenceTerminationPolicy MillisecondsmaxLength="300005"/> </wsrmp:RMAssertion>wsrm-mgr:sourcePolicy> <wsrm-mgr:destinationPolicy acceptOffers="false"> </wsp:All> </wsp:Policy><wsrm:store> <ref bean="myStore"/> <p:/policies></wsrm:store> </jaxwswsrm-mgr:features>reliableMessaging> </bean> Enabling and Configuring WS-Reliable Messaging using the WS-Reliable Messaging Feature TODO Enabling and Configuring WS-Reliable Messaging using Beans To ensure that the Reliable Messaging interceptors are added to the appropriate interceptor chains, e.g. for all client and server endpoints: cxf:features> </cxf:bus> |
Configuring the Reliable Messaging Store
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 (namespace http://cxf.apache.org/ws/rm/manager) inside the wsrm-mgr:reliableMessaging element. The jdbcStore bean supports the attributes:
Attribute Name | Type | Default |
---|---|---|
dataSource | String | null |
driverClassName | String | org.apache.derby.jdbc.EmbeddedDriver |
initialReconnectDelay | long | 0 |
keepConnection | boolean | false |
maxReconnectAttempts | int | 0 |
passWord | String | null |
tableExistsCode | int | 0 |
tableExistsState | String | null |
schemaName | String | null |
userName | String | null |
url | String | jdbc:derby:rmdb;create=true |
Example:
Code Block | ||||
---|---|---|---|---|
| ||||
<wsrm-mgr:jdbcStore xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager" id="myStore"
driverClassName="org.apache.derby.jdbc.ClientDriver"
url="jdbc:derby://localhost:1527/rmdb;create=true"
password="password"/>
|
See the jdbcStore element definition in the RM Manager schema for more details of the attribute usages.
Adding the Reliable Messaging Interceptors Manually
To ensure that the Reliable Messaging interceptors are added to the appropriate interceptor chains, e.g. for all client and server endpoints:
Code Block | ||||
---|---|---|---|---|
| ||||
<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"/> <cxf:bus ...> <cxf:inInterceptors> <ref bean="rmLogicalIn"/> <ref bean="rmCodec"/> </cxf:inInterceptors> <cxf:inFaultInterceptors> <ref bean="rmLogicalIn"/> <ref bean="rmCodec"/> </cxf:inFaultInterceptors> <cxf:outInterceptors> <ref bean="rmLogicalOut"/> <ref bean="rmCodec"/> </cxf:outInterceptors> <cxf:outFaultInterceptors> <ref bean="rmLogicalOut"/> <ref bean="rmCodec"/> <cxf:outFaultInterceptors> </cxf:bus> |
The
...
RetransmissionIntercepor
...
will
...
be
...
added
...
on
...
the
...
fly
...
by
...
the
...
RMOutInterceptor
...
so
...
need
...
not
...
appear
...
in
...
your
...
configuration
...
file.
...
Configuring the Reliable Messaging Manager Manually
To configure properties of the RM Manager, you can use the rmManager element from the http://cxf.apache.org/ws/rm/manager
...
namespace.
...
It
...
supports
...
the
...
same child elements as the reliableMessaging feature element above. For example, without using features, you can determine that seuences should have a maximum length of 5 as follows:
Code Block | ||||
---|---|---|---|---|
| ||||
<wsrm-mgr:rmManager xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager"> <wsrm-mgr:sourcePolicy> <wsrm-mgr:sequenceTerminationPolicy maxLength="5"/> </wsrm-mgr:sourcePolicy> elements: Element Value sourcePolicy ... destinationpolicy ... rmAssertion ... store The RM store. This must be a bean or a reference to a bean that implements the org.apache.cxf.ws.rm.persistence.RMStore. To enable persistence, you must specify the class 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 that is). In that case, you may need to configure the driver class and connection parameters: Property Name Type Default driverClassName String org.apache.derby.jdbc.EmbeddedDriver userName String null passWord String null url String jdbc:derby:rmdb;create=true Example: {code:xml} <bean class="org.apache.cxf.ws.rm.persistence.jdbc.RMTxStore"> <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/> <property name="url" value="jdbc:derby://localhost:1527/rmdb;create=true"/> <property name="password" value="password"/> </bean> <wsrm-mgr:rmManager xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager"> <property name="store" ref="org.apache.cxf.ws.rm.persistence.jdbc.RMTxStore"/> </wsrm-mgr:rmManager> |