Author: gatfora
Date: Fri Dec 22 05:39:43 2006
New Revision: 489651
URL: http://svn.apache.org/viewvc?view=rev&rev=489651
Log:
Allow client to create a sequence over a sequence that was previously terminated
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java?view=diff&rev=489651&r1=489650&r2=489651
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
Fri Dec 22 05:39:43 2006
@@ -19,6 +19,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
import java.util.MissingResourceException;
import javax.xml.namespace.QName;
@@ -45,6 +46,7 @@
import org.apache.sandesha2.SandeshaException;
import org.apache.sandesha2.i18n.SandeshaMessageHelper;
import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
import org.apache.sandesha2.storage.StorageManager;
import org.apache.sandesha2.storage.Transaction;
import org.apache.sandesha2.storage.beanmanagers.RMSBeanMgr;
@@ -324,22 +326,108 @@
String oldAction = options.getAction();
options.setAction(SpecSpecificConstants.getCreateSequenceAction(rmSpecVersion));
+ ServiceContext serviceContext =
serviceClient.getServiceContext();
+ if (serviceContext == null)
+ throw new
SandeshaException(SandeshaMessageHelper.getMessage(
+
SandeshaMessageKeys.serviceContextNotSet));
+
+ ConfigurationContext configurationContext =
serviceContext.getConfigurationContext();
+
+ // cleanup previous sequence
+ cleanupTerminatedSequence(to, oldSequenceKey,
SandeshaUtil.getSandeshaStorageManager(configurationContext,
configurationContext.getAxisConfiguration()));
+
try {
//just to inform the sender.
serviceClient.fireAndForget (null);
} catch (AxisFault e) {
throw new SandeshaException(e);
}
-
- options.setAction(oldAction);
-
- options.setProperty(SandeshaClientConstants.DUMMY_MESSAGE,
Sandesha2Constants.VALUE_FALSE);
- options.setProperty(SandeshaClientConstants.SEQUENCE_KEY,
oldSequenceKey);
+ finally {
+ options.setAction(oldAction);
+
+
options.setProperty(SandeshaClientConstants.DUMMY_MESSAGE,
Sandesha2Constants.VALUE_FALSE);
+
options.setProperty(SandeshaClientConstants.SEQUENCE_KEY, oldSequenceKey);
+ }
if (log.isDebugEnabled())
log.debug("Exit: SandeshaClient::createSequence");
}
+ /**
+ * If a user has requested to create a new sequence which was
previously terminated, we need to clean up
+ * any previous properties that might have been stored.
+ * @param to
+ * @param sequenceKey
+ * @throws SandeshaStorageException
+ */
+ private static final void cleanupTerminatedSequence(String to, String
sequenceKey, StorageManager storageManager) throws SandeshaException {
+ String internalSequenceId =
SandeshaUtil.getInternalSequenceID(to, sequenceKey);
+
+ if (log.isTraceEnabled())
+ log.trace("Checking if sequence " + internalSequenceId
+ " previously terminated");
+
+ Transaction tran = storageManager.getTransaction();
+
+ try {
+
+ SequencePropertyBeanMgr seqPropMgr =
storageManager.getSequencePropertyBeanMgr();
+
+ boolean terminatedSequence = false;
+
+ //see if the sequence is terminated
+ SequencePropertyBean sequenceTerminated =
seqPropMgr.retrieve(internalSequenceId,
Sandesha2Constants.SequenceProperties.TERMINATE_ADDED);
+ if(sequenceTerminated!=null){
+ terminatedSequence = true;
+ }
+
+ //see if the sequence is timed out
+ SequencePropertyBean sequenceTimedout =
seqPropMgr.retrieve(internalSequenceId,
Sandesha2Constants.SequenceProperties.SEQUENCE_TIMED_OUT);
+ if(sequenceTimedout!=null){
+ terminatedSequence = true;
+ }
+
+ if (terminatedSequence) {
+ // We need to find out the original sequence id
for this sequence by doing a backwards lookup
+ SequencePropertyBean bean = new
SequencePropertyBean();
+
bean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+ bean.setValue(internalSequenceId);
+ bean = seqPropMgr.findUnique(bean);
+
+ String sequenceId = null;
+ if (bean != null)
+ sequenceId = bean.getSequencePropertyKey();
+
+ // Find all properties which have a matching
internal sequence id
+ removeBeans(sequenceId, seqPropMgr);
+ removeBeans(internalSequenceId, seqPropMgr);
+ }
+
+ } catch (SandeshaException e) {
+ tran.rollback();
+ tran = null;
+
+ throw e;
+ }
+
+ tran.commit();
+ }
+
+ private static final void removeBeans(String sequenceId,
SequencePropertyBeanMgr seqPropMgr) throws SandeshaStorageException {
+ // Find all properties which have a matching sequence id
+ SequencePropertyBean bean = new SequencePropertyBean();
+ bean.setSequencePropertyKey(sequenceId);
+ List beans = seqPropMgr.find(bean);
+
+ Iterator iterator = beans.iterator();
+
+ while (iterator.hasNext()) {
+ bean = (SequencePropertyBean)iterator.next();
+
+ seqPropMgr.delete(bean.getSequencePropertyKey(),
bean.getName());
+ }
+
+ }
+
/**
* Clients can use this to create a sequence sequence.
*
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java?view=diff&rev=489651&r1=489650&r2=489651
==============================================================================
---
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
(original)
+++
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
Fri Dec 22 05:39:43 2006
@@ -74,6 +74,9 @@
boolean continueSending = true;
if (timeOutSequence) {
+ // Warn the user that the sequence has timed out
+ //if (log.isWarnEnabled())
+ // log.warn();
stopRetransmission(retransmitterBean);
// Only messages of outgoing sequences get
retransmitted. So named
Modified:
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
URL:
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java?view=diff&rev=489651&r1=489650&r2=489651
==============================================================================
---
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
(original)
+++
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
Fri Dec 22 05:39:43 2006
@@ -454,9 +454,81 @@
finally {
configContext.getListenerManager().stop();
serviceClient.cleanup();
- }
+ }
+ }
+
+ /**
+ * Checks the following scenario
+ *
+ * 1) send an application message (will generate the create sequence)
+ * 2) terminate the sequence
+ * 3) Issue wait until sequence completed (with a wait time)
+ * 4) Create a new sequence
+ * 5) send another application message
+ * 6) terminate the sequence
+ * 7) Ensure that the sequence was terminated
+ *
+ */
+ public void testTerminateCreateWithWait () throws Exception {
+
+ startServer(server_repoPath, server_axis2_xml);
+
+ String to = "http://127.0.0.1:" + 9999 +
"/axis2/services/RMSampleService";
+
+ String repoPath = "target" + File.separator + "repos" +
File.separator + "client";
+ String axis2_xml = "target" + File.separator + "repos" +
File.separator + "client" + File.separator + "client_axis2.xml";
+
+ ConfigurationContext configContext =
ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml);
+ Options clientOptions = new Options ();
+ clientOptions.setAction(pingAction);
+
clientOptions.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+ clientOptions.setProperty(SandeshaClientConstants.RM_SPEC_VERSION,
+ Sandesha2Constants.SPEC_VERSIONS.v1_1);
+ clientOptions.setTo(new EndpointReference (to));
+
+ ServiceClient serviceClient = new ServiceClient
(configContext,null);
+
+ String acksTo =
serviceClient.getMyEPR(Constants.TRANSPORT_HTTP).getAddress();
+
clientOptions.setProperty(SandeshaClientConstants.AcksTo,acksTo);
+ clientOptions.setTransportInProtocol(Constants.TRANSPORT_HTTP);
+ //serviceClient.
+ serviceClient.setOptions(clientOptions);
+
+ try{
+ // 1) Send the application message
+ serviceClient.fireAndForget(getPingOMBlock("ping1"));
+
+ // 2) Terminate the sequence
+ SandeshaClient.terminateSequence(serviceClient);
+
+ // 3) wait for the sequence completion (30 second wait)
+
SandeshaClient.waitUntilSequenceCompleted(serviceClient, 30000);
+
+ // 4) Create a new Sequence to the same endpoint
+ SandeshaClient.createSequence(serviceClient, false,
null);
+
+ // 5) Send the second application message (this should
use a new sequence)
+ serviceClient.fireAndForget(getPingOMBlock("ping2"));
+
+ // 6) Terminate the sequence
+ SandeshaClient.terminateSequence(serviceClient);
+
+ // 7) wait for the sequence completion (30 second wait)
+
SandeshaClient.waitUntilSequenceCompleted(serviceClient, 30000);
+
+ // 8) Check that the sequence has terminated
+ SequenceReport report =
SandeshaClient.getOutgoingSequenceReport(serviceClient);
+ assertNotNull(report);
+ assertEquals(SequenceReport.SEQUENCE_STATUS_TERMINATED,
report.getSequenceStatus());
+
+ }
+ finally {
+ configContext.getListenerManager().stop();
+ serviceClient.cleanup();
+ }
}
+
//
// public void testCloseSequence () {
//
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]