WS-Addressing handler should not drop messages when the RelatesTo property is
explicitly set by client code
-----------------------------------------------------------------------------------------------------------
Key: CXF-2167
URL: https://issues.apache.org/jira/browse/CXF-2167
Project: CXF
Issue Type: Improvement
Affects Versions: 2.1.4
Environment: Found in JBossWS/CXF 2.1.4.
Reporter: Andrew Dinn
The WS Addressing (WSA) class MAPCodec checks the RelatesTo field of an
incoming Message Addressing Properties to see if it equals a previously cached
outgoing MessageId field. This allows it to re-establish the exchange
associated with an outgoing message in a request-reply (RPC) style exchange. If
a RelatesTo value is found which does nto correspond to a cached MessageId the
message is dropped.
The problem with this is that it breaks use of the RelatesTo field by
application code. Specifically, an application may wish to correlate sequences
of 1-way messages by installing the MessageId from one message into the
RelatesTo field of its successor. Since these messages employ different
channels MPACodec will not find a cached MessageId for a successor message and
so stop delivery of the messages.
A proposed fix is to change MAPCodec so that it only disables delivery if the
RelatesTo field has a null value for its RelationshipType or if the
RelationshipType is set to http://www.w3.org/2005/08/addressing/reply (this is
the default value implied by a null setting). A patch for this fix which has
been tested in JBossWS/CXF is given below
[ad...@toby cxf-2.1.4]$ svn diff
rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
Index: rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
===================================================================
--- rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
(revision 761707)
+++ rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
(working copy)
@@ -53,6 +53,8 @@
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
+import org.apache.cxf.ws.addressing.AddressingBuilder;
+import org.apache.cxf.ws.addressing.AddressingConstants;
import org.apache.cxf.ws.addressing.AddressingProperties;
import org.apache.cxf.ws.addressing.AddressingPropertiesImpl;
import org.apache.cxf.ws.addressing.AttributedURIType;
@@ -73,6 +75,8 @@
private static final Logger LOG = LogUtils.getL7dLogger(MAPCodec.class);
private static final String IS_REFERENCE_PARAM_ATTR_NAME =
"IsReferenceParameter";
+ private static final AddressingConstants ADDRESSING_CONSTANTS
+ = AddressingBuilder.getAddressingBuilder().newAddressingConstants();
/**
* REVISIT: map usage that the *same* interceptor instance
@@ -83,7 +87,7 @@
private VersionTransformer transformer;
private HeaderFactory headerFactory;
-
+
/**
* Constructor.
*/
@@ -463,6 +467,12 @@
AttributedURIType.class,
headerElement,
unmarshaller));
+ } else if (Names.WSA_FROM_NAME.equals(localName)) {
+ maps.setFrom(decodeAsNative(
+ headerURI,
+
EndpointReferenceType.class,
+ headerElement,
+ unmarshaller));
} else if (Names.WSA_TO_NAME.equals(localName)) {
AttributedURIType addr = decodeAsNative(
headerURI,
@@ -721,7 +731,7 @@
* @param maps the addressing properties
*/
private void restoreExchange(SoapMessage message, AddressingProperties
maps) {
- if (maps != null && maps.getRelatesTo() != null) {
+ if (maps != null && maps.getRelatesTo() != null &&
isRelationshipReply(maps.getRelatesTo())) {
Exchange correlatedExchange =
uncorrelatedExchanges.remove(maps.getRelatesTo().getValue());
if (correlatedExchange != null) {
@@ -755,6 +765,11 @@
}
+ private boolean isRelationshipReply(RelatesToType relatesTo) {
+ return relatesTo.getRelationshipType() == null
+ ||
relatesTo.getRelationshipType().equals(ADDRESSING_CONSTANTS.getRelationshipReply());
+ }
+
/**
* Marks a message as partial response
*
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.