Author: mlovett
Date: Tue Nov 28 01:44:49 2006
New Revision: 479964
URL: http://svn.apache.org/viewvc?view=rev&rev=479964
Log:
Use WS-A to track response messages instead of saving the message context. See
SANDESHA2-51
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java
Tue Nov 28 01:44:49 2006
@@ -307,17 +307,24 @@
String REQUEST_SIDE_SEQUENCE_ID = "RequestSideSequenceID";
//used only at the server side
+ // A pair of properties to keep track of the highest received
message
+ // for an inbound sequence.
String HIGHEST_IN_MSG_NUMBER = "HighestInMsgNumber";
+ String HIGHEST_IN_MSG_ID = "HighestInMsgId";
- String HIGHEST_IN_MSG_KEY = "HighestInMsgKey";
+ // Once an inbound sequence is closed, or we receive a message
with the
+ // 'LastMessage' marker, we record the message id of the
highest message
+ // in the sequence.
+ String LAST_IN_MSG_ID = "LastInMessageId";
+ // A pair pf properties to keep track of the highest
transmitted message
+ // for an outbound sequence.
String HIGHEST_OUT_MSG_NUMBER = "HighestOutMsgNumber";
-
- String HIGHEST_OUT_MSG_KEY = "HighestOutMsgKey";
-
+ String HIGHEST_OUT_RELATES_TO = "HighestOutRelatesTo";
+
+ // Once the last message for any outbound sequence has been
acknowledged,
+ // we can safely close the sequence.
String LAST_OUT_MESSAGE_NO = "LastOutMessage";
-
- String LAST_IN_MESSAGE_NO = "LastInMessage";
String SECURITY_TOKEN = "SecurityToken";
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java
Tue Nov 28 01:44:49 2006
@@ -140,8 +140,10 @@
RMMsgContext reqRMMsgCtx =
MsgInitializer.initializeMessage(requestMsgCtx);
Sequence sequencePart = (Sequence) reqRMMsgCtx
.getMessagePart(Sandesha2Constants.MessageParts.SEQUENCE);
- if (sequencePart != null)
- msgProcessor = new ApplicationMsgProcessor();// a
rm intended message
+ if (sequencePart != null) {
+ String incomingSeqId =
sequencePart.getIdentifier().getIdentifier();
+ msgProcessor = new
ApplicationMsgProcessor(incomingSeqId);// a rm intended message
+ }
} else // if client side.
msgProcessor = new ApplicationMsgProcessor();
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
Tue Nov 28 01:44:49 2006
@@ -120,7 +120,7 @@
public static final String outMsgHasNoEnvelope="outMsgHasNoEnvelope";
public static final String
msgNumberExceededLastMsgNo="msgNumberExceededLastMsgNo";
public static final String ackInvalid="ackInvalid";
- public static final String
highestMsgKeyNotStored="highestMsgKeyNotStored";
+ public static final String
highestMsgIdNotStored="highestMsgIdNotStored";
public static final String
cannotHaveFinalWithNack="cannotHaveFinalWithNack";
public static final String
accptButNoSequenceOffered="accptButNoSequenceOffered";
public static final String
relatesToNotAvailable="relatesToNotAvailable";
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/i18n/resource.properties
Tue Nov 28 01:44:49 2006
@@ -145,7 +145,7 @@
outMsgHasNoEnvelope=Out message does not have a envelope: {0}
msgNumberExceededLastMsgNo=The received message number {0} on sequence {1}
exceeds the message number {1} which was declared as last in a previosly
received application message.
ackInvalid=The SequenceAcknowledgement received is invalid as the lower value
{1} is larger than upper value {2}.
-highestMsgKeyNotStored=Key of the highest message number has not been stored
for sequence {0}
+highestMsgIdNotStored=The MessageId of the highest message number has not been
stored for sequence {0}
cannotHaveFinalWithNack=The ''Final'' element cannot be present when there are
Nack elements under the SequenceAcknowledgement.
accptButNoSequenceOffered=Error: An ''accept'' was received but there was no
offered sequence entry.
relatesToNotAvailable: Invalid create sequence message: ''RelatesTo'' part is
not available.
@@ -202,7 +202,7 @@
noAckRequestedElement=Message identified as of type ''AckRequested'' but it
does not have an ''AckRequeted'' element.
invalidAckMessageEntry=Invalid ack message entry: {0}
seqPartIsNull=Sequence part is null.
-incomingSequenceNotValidID="The ID for the incoming sequence is not valid: {0}"
+incomingSequenceNotValidID=The ID for the incoming sequence is not valid:
''{0}''.
seqFaultCannotBeExtractedToNonHeader=Cannot extract ''Sequence Fault'' part
from a non-header element.
seqElementCannotBeAddedToNonHeader=''Sequence'' element cannot be added to
non-header element.
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
Tue Nov 28 01:44:49 2006
@@ -21,6 +21,7 @@
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.addressing.RelatesTo;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
@@ -67,6 +68,15 @@
private static final Log log =
LogFactory.getLog(ApplicationMsgProcessor.class);
+ private String inboundSequence = null;
+
+ public ApplicationMsgProcessor() {
+ // Nothing to do
+ }
+
+ public ApplicationMsgProcessor(String inboundSequenceId) {
+ this.inboundSequence = inboundSequenceId;
+ }
public boolean processInMessage(RMMsgContext rmMsgCtx) throws AxisFault
{
if (log.isDebugEnabled()) {
@@ -75,7 +85,7 @@
}
return false;
}
-
+
public boolean processOutMessage(RMMsgContext rmMsgCtx) throws
AxisFault {
if (log.isDebugEnabled())
log.debug("Enter:
ApplicationMsgProcessor::processOutMessage");
@@ -119,43 +129,22 @@
boolean lastMessage = false;
if (serverSide) {
- // getting the request message and rmMessage.
- MessageContext reqMsgCtx;
- try {
- reqMsgCtx =
msgContext.getOperationContext().getMessageContext(
-
OperationContextFactory.MESSAGE_LABEL_IN_VALUE);
- } catch (AxisFault e) {
- throw new SandeshaException(e);
- }
-
- RMMsgContext requestRMMsgCtx =
MsgInitializer.initializeMessage(reqMsgCtx);
-
- Sequence reqSequence = (Sequence)
requestRMMsgCtx.getMessagePart(Sandesha2Constants.MessageParts.SEQUENCE);
- if (reqSequence == null) {
- String message =
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.seqPartIsNull);
+ if (inboundSequence == null ||
"".equals(inboundSequence)) {
+ String message =
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.incomingSequenceNotValidID,
inboundSequence);
log.debug(message);
throw new SandeshaException(message);
}
- String incomingSeqId =
reqSequence.getIdentifier().getIdentifier();
- if (incomingSeqId == null || "".equals(incomingSeqId)) {
- String message =
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.incomingSequenceNotValidID,
"''"
- + incomingSeqId + "''");
- log.debug(message);
- throw new SandeshaException(message);
- }
-
- long requestMsgNo =
reqSequence.getMessageNumber().getMessageNumber();
-
- internalSequenceId =
SandeshaUtil.getOutgoingSideInternalSequenceID(incomingSeqId);
+ internalSequenceId =
SandeshaUtil.getOutgoingSideInternalSequenceID(inboundSequence);
- // deciding weather the last message.
- String requestLastMsgNoStr =
SandeshaUtil.getSequenceProperty(incomingSeqId,
-
Sandesha2Constants.SequenceProperties.LAST_IN_MESSAGE_NO, storageManager);
- if (requestLastMsgNoStr != null) {
- long requestLastMsgNo =
Long.parseLong(requestLastMsgNoStr);
- if (requestLastMsgNo == requestMsgNo)
- lastMessage = true;
+ // Deciding weather this is the last message. We assume
it is if it relates to
+ // a message which arrived with the LastMessage flag on
it.
+ String lastRequestId =
SandeshaUtil.getSequenceProperty(inboundSequence,
+
Sandesha2Constants.SequenceProperties.LAST_IN_MSG_ID, storageManager);
+ RelatesTo relatesTo = msgContext.getRelatesTo();
+ if(relatesTo != null && lastRequestId != null &&
+
lastRequestId.equals(relatesTo.getValue())) {
+ lastMessage = true;
}
} else {
@@ -239,16 +228,17 @@
SequencePropertyBean responseHighestMsgBean = new
SequencePropertyBean(sequencePropertyKey,
Sandesha2Constants.SequenceProperties.HIGHEST_OUT_MSG_NUMBER, new
Long(messageNumber).toString());
seqPropMgr.insert(responseHighestMsgBean);
+ RelatesTo relatesTo = msgContext.getRelatesTo();
+ if(relatesTo != null) {
+ SequencePropertyBean responseRelatesToBean = new
SequencePropertyBean(sequencePropertyKey,
+
Sandesha2Constants.SequenceProperties.HIGHEST_OUT_RELATES_TO,
relatesTo.getValue());
+ seqPropMgr.insert(responseRelatesToBean);
+ }
if (lastMessage) {
-
- SequencePropertyBean responseHighestMsgKeyBean = new
SequencePropertyBean(sequencePropertyKey,
-
Sandesha2Constants.SequenceProperties.HIGHEST_OUT_MSG_KEY, storageKey);
-
SequencePropertyBean responseLastMsgKeyBean = new
SequencePropertyBean(sequencePropertyKey,
Sandesha2Constants.SequenceProperties.LAST_OUT_MESSAGE_NO, new
Long(messageNumber).toString());
- seqPropMgr.insert(responseHighestMsgKeyBean);
seqPropMgr.insert(responseLastMsgKeyBean);
}
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java
Tue Nov 28 01:44:49 2006
@@ -175,10 +175,6 @@
// message number retrieved from this sequence.
String highetsInMsgNoStr =
SandeshaUtil.getSequenceProperty(propertyKey,
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_NUMBER, storageManager);
- String highetsInMsgKey =
SandeshaUtil.getSequenceProperty(propertyKey,
-
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_KEY, storageManager);
- if (highetsInMsgKey == null)
- highetsInMsgKey = SandeshaUtil.getUUID();
long highestInMsgNo = 0;
if (highetsInMsgNoStr != null) {
@@ -186,24 +182,17 @@
}
if (msgNo > highestInMsgNo) {
- highestInMsgNo = msgNo;
-
- String str = new Long(msgNo).toString();
SequencePropertyBean highestMsgNoBean = new
SequencePropertyBean(propertyKey,
-
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_NUMBER, str);
- SequencePropertyBean highestMsgKeyBean = new
SequencePropertyBean(propertyKey,
-
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_KEY, highetsInMsgKey);
-
- // storing the new message as the highest in message.
- storageManager.removeMessageContext(highetsInMsgKey);
- storageManager.storeMessageContext(highetsInMsgKey,
msgCtx);
+
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_NUMBER,
Long.toString(msgNo));
+ SequencePropertyBean highestMsgIdBean = new
SequencePropertyBean(propertyKey,
+
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_ID, msgCtx.getMessageID());
if (highetsInMsgNoStr != null) {
seqPropMgr.update(highestMsgNoBean);
- seqPropMgr.update(highestMsgKeyBean);
+ seqPropMgr.update(highestMsgIdBean);
} else {
seqPropMgr.insert(highestMsgNoBean);
- seqPropMgr.insert(highestMsgKeyBean);
+ seqPropMgr.insert(highestMsgIdBean);
}
}
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java
Tue Nov 28 01:44:49 2006
@@ -188,14 +188,14 @@
String highestImMsgNumberStr =
SandeshaUtil.getSequenceProperty(requestSidesequencePropertyKey,
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_NUMBER, storageManager);
- String highestImMsgKey =
SandeshaUtil.getSequenceProperty(requestSidesequencePropertyKey,
-
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_KEY, storageManager);
+ String highestImMsgId =
SandeshaUtil.getSequenceProperty(requestSidesequencePropertyKey,
+
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_ID, storageManager);
long highestInMsgNo = 0;
if (highestImMsgNumberStr != null) {
- if (highestImMsgKey == null)
+ if (highestImMsgId == null)
throw new
SandeshaException(SandeshaMessageHelper.getMessage(
-
SandeshaMessageKeys.highestMsgKeyNotStored, sequenceId));
+
SandeshaMessageKeys.highestMsgIdNotStored, sequenceId));
highestInMsgNo = Long.parseLong(highestImMsgNumberStr);
}
@@ -213,44 +213,22 @@
if (highestInMsgNo == 0) {
addResponseSideTerminate = false;
} else {
-
- // setting the last in message property
+ // Mark up the highest inbound message as if it
had the last message flag on it.
+ //
+ String inMsgId = highestImMsgId;
SequencePropertyBean lastInMsgBean = new
SequencePropertyBean(requestSidesequencePropertyKey,
-
Sandesha2Constants.SequenceProperties.LAST_IN_MESSAGE_NO,
highestImMsgNumberStr);
+
Sandesha2Constants.SequenceProperties.LAST_IN_MSG_ID, highestImMsgId);
seqPropMgr.insert(lastInMsgBean);
-
- MessageContext highestInMsg =
storageManager.retrieveMessageContext(highestImMsgKey, configCtx);
-
- // TODO get the out message in a storage
friendly manner.
- MessageContext highestOutMessage =
highestInMsg.getOperationContext().getMessageContext(
-
OperationContextFactory.MESSAGE_LABEL_FAULT_VALUE);
-
- if (highestOutMessage == null ||
highestOutMessage.getEnvelope() == null)
- highestOutMessage =
highestInMsg.getOperationContext().getMessageContext(
-
OperationContextFactory.MESSAGE_LABEL_OUT_VALUE);
-
- if (highestOutMessage != null) {
- if (highestOutMessage.getEnvelope() ==
null)
- throw new
SandeshaException(SandeshaMessageHelper
-
.getMessage(SandeshaMessageKeys.outMsgHasNoEnvelope));
-
- RMMsgContext highestOutRMMsg =
MsgInitializer.initializeMessage(highestOutMessage);
- Sequence seqPartOfOutMsg = (Sequence)
highestOutRMMsg
-
.getMessagePart(Sandesha2Constants.MessageParts.SEQUENCE);
-
- if (seqPartOfOutMsg != null) {
-
- // response message of the last
in message can be
- // considered as the last out
message.
- highestOutMsgNo =
seqPartOfOutMsg.getMessageNumber().getMessageNumber();
- SequencePropertyBean
highestOutMsgBean = new SequencePropertyBean(
-
responseSideSequencePropertyKey ,
-
Sandesha2Constants.SequenceProperties.LAST_OUT_MESSAGE_NO, new
Long(highestOutMsgNo)
-
.toString());
-
-
seqPropMgr.insert(highestOutMsgBean);
- addResponseSideTerminate = true;
- }
+
+ // If an outbound message has already gone out
with that relatesTo, then we can terminate
+ // right away.
+ String highestOutRelatesTo =
SandeshaUtil.getSequenceProperty(responseSideSequencePropertyKey,
+
Sandesha2Constants.SequenceProperties.HIGHEST_OUT_RELATES_TO, storageManager);
+ if(highestOutRelatesTo != null &&
highestOutRelatesTo.equals(inMsgId)) {
+ String highOutMessageNumberString =
SandeshaUtil.getSequenceProperty(responseSideSequencePropertyKey,
+
Sandesha2Constants.SequenceProperties.HIGHEST_OUT_MSG_NUMBER, storageManager);
+ highestOutMsgNo =
Long.parseLong(highOutMessageNumberString);
+ addResponseSideTerminate = true;
}
}
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java?view=diff&rev=479964&r1=479963&r2=479964
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java
Tue Nov 28 01:44:49 2006
@@ -143,13 +143,6 @@
private static void
completeTerminationOfReceivingSide(ConfigurationContext configContext, String
sequencePropertyKey,String sequenceId,
StorageManager storageManager) throws SandeshaException
{
- // removing the HighestInMessage entry.
- String highestInMessageKey =
SandeshaUtil.getSequenceProperty(sequencePropertyKey,
-
Sandesha2Constants.SequenceProperties.HIGHEST_IN_MSG_KEY, storageManager);
- if (highestInMessageKey != null) {
-
storageManager.removeMessageContext(highestInMessageKey);
- }
-
removeReceivingSideProperties(configContext,
sequencePropertyKey, sequenceId, storageManager);
// removing nextMsgMgr entries
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]