You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sandesha-dev@ws.apache.org by ga...@apache.org on 2007/02/19 11:50:10 UTC
svn commit: r509152 - in /webservices/sandesha/trunk/java:
src/org/apache/sandesha2/util/ test/src/org/apache/sandesha2/faulttests/
Author: gatfora
Date: Mon Feb 19 02:50:09 2007
New Revision: 509152
URL: http://svn.apache.org/viewvc?view=rev&rev=509152
Log:
Notify waiting clients that a sequence has timed out
Added:
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java
Modified:
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java?view=diff&rev=509152&r1=509151&r2=509152
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java Mon Feb 19 02:50:09 2007
@@ -55,8 +55,7 @@
import org.apache.sandesha2.client.SandeshaListener;
import org.apache.sandesha2.i18n.SandeshaMessageHelper;
import org.apache.sandesha2.i18n.SandeshaMessageKeys;
-import org.apache.sandesha2.security.SecurityManager;
-import org.apache.sandesha2.security.SecurityToken;
+import org.apache.sandesha2.storage.SandeshaStorageException;
import org.apache.sandesha2.storage.StorageManager;
import org.apache.sandesha2.storage.beanmanagers.RMSBeanMgr;
import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr;
@@ -648,43 +647,51 @@
RMSBean rmsBean = rmsBeanMgr.retrieve(createSeqMsgId);
if (rmsBean == null) {
- String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.createSeqEntryNotFound);
- log.debug(message);
- throw new SandeshaException(message);
- }
-
- // Check that the create sequence response message proves possession of the correct token
- String tokenData = rmsBean.getSecurityTokenData();
- if(tokenData != null) {
- SecurityManager secManager = SandeshaUtil.getSecurityManager(configCtx);
- MessageContext crtSeqResponseCtx = rmMsgCtx.getMessageContext();
- OMElement body = crtSeqResponseCtx.getEnvelope().getBody();
- SecurityToken token = secManager.recoverSecurityToken(tokenData);
- secManager.checkProofOfPossession(token, body, crtSeqResponseCtx);
+ if (log.isDebugEnabled())
+ log.debug("Exit: FaultManager::processCreateSequenceRefusedFault Unable to find RMSBean");
+ return;
}
-
- String internalSequenceId = rmsBean.getInternalSequenceID();
- if (internalSequenceId == null || "".equals(internalSequenceId)) {
- String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.tempSeqIdNotSet);
- log.debug(message);
- throw new SandeshaException(message);
+
+ /* if (rmsBean.getLastSendError() == null) {
+ // Indicate that there was an error when sending the Create Sequence.
+ rmsBean.setLastSendError(fault);
+
+ // Update the RMSBean
+ rmsBeanMgr.update(rmsBean);
+ if (log.isDebugEnabled())
+ log.debug("Exit: FaultManager::processCreateSequenceRefusedFault Allowing another CreateSequence attempt");
+ return;
}
- rmMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
-
+*/
SenderBean createSequenceSenderBean = retransmitterMgr.retrieve(createSeqMsgId);
if (createSequenceSenderBean == null)
throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.createSeqEntryNotFound));
// deleting the create sequence entry.
retransmitterMgr.delete(createSeqMsgId);
-
+
+ // Notify the clients of a failure
+ notifyClientsOfFault(rmsBean.getInternalSequenceID(), storageManager, configCtx, fault);
+
+ rmMsgCtx.pause();
+
+ // Cleanup sending side.
+ if (log.isDebugEnabled())
+ log.debug("Terminating sending sequence " + rmsBean);
+ TerminateManager.terminateSendingSide(rmsBean, storageManager);
+
+ if (log.isDebugEnabled())
+ log.debug("Exit: FaultManager::processCreateSequenceRefusedFault");
+ }
+
+ static void notifyClientsOfFault(String internalSequenceId,
+ StorageManager storageManager, ConfigurationContext configCtx, AxisFault fault) throws SandeshaStorageException {
// Locate and update all of the messages for this sequence, now that we know
// the sequence id.
SenderBean target = new SenderBean();
target.setInternalSequenceID(internalSequenceId);
- target.setSend(false);
- Iterator iterator = retransmitterMgr.find(target).iterator();
+ Iterator iterator = storageManager.getSenderBeanMgr().find(target).iterator();
while (iterator.hasNext()) {
SenderBean tempBean = (SenderBean) iterator.next();
@@ -707,15 +714,6 @@
}
}
}
-
- rmMsgCtx.pause();
-
- // Cleanup sending side.
- if (log.isDebugEnabled())
- log.debug("Terminating sending sequence " + rmsBean);
- TerminateManager.terminateSendingSide(rmsBean, storageManager);
- if (log.isDebugEnabled())
- log.debug("Exit: FaultManager::processCreateSequenceRefusedFault");
}
}
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=509152&r1=509151&r2=509152
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java Mon Feb 19 02:50:09 2007
@@ -29,6 +29,8 @@
import org.apache.sandesha2.client.SandeshaClientConstants;
import org.apache.sandesha2.client.SandeshaListener;
import org.apache.sandesha2.client.SequenceReport;
+import org.apache.sandesha2.i18n.SandeshaMessageHelper;
+import org.apache.sandesha2.i18n.SandeshaMessageKeys;
import org.apache.sandesha2.policy.SandeshaPolicyBean;
import org.apache.sandesha2.storage.StorageManager;
import org.apache.sandesha2.storage.beans.SenderBean;
@@ -70,20 +72,21 @@
if (maxRetransmissionAttempts >= 0 && retransmitterBean.getSentCount() > maxRetransmissionAttempts)
timeOutSequence = true;
- boolean sequenceTimedOut = SequenceManager.hasSequenceTimedOut(internalSequenceID, rmMsgCtx, storageManager);
- if (sequenceTimedOut)
- timeOutSequence = true;
+ if (!timeOutSequence)
+ timeOutSequence = SequenceManager.hasSequenceTimedOut(internalSequenceID, rmMsgCtx, storageManager);
if (timeOutSequence) {
+
+ retransmitterBean.setSend(false);
+
// 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
// following method according to that.
- finalizeTimedOutSequence(internalSequenceID, sequenceID, rmMsgCtx.getMessageContext(), storageManager);
+ finalizeTimedOutSequence(internalSequenceID, rmMsgCtx.getMessageContext(), storageManager);
continueSending = false;
}
}
@@ -125,10 +128,6 @@
return retransmitterBean;
}
- private static void stopRetransmission(SenderBean bean) {
- bean.setSend(false);
- }
-
private static long generateNextExponentialBackedoffDifference(int count, long initialInterval) {
long interval = initialInterval;
for (int i = 1; i < count; i++) {
@@ -138,17 +137,23 @@
return interval;
}
- private static void finalizeTimedOutSequence(String internalSequenceID, String sequenceID, MessageContext messageContext,
+ private static void finalizeTimedOutSequence(String internalSequenceID, MessageContext messageContext,
StorageManager storageManager) throws SandeshaException {
ConfigurationContext configurationContext = messageContext.getConfigurationContext();
+ // Notify the clients of a timeout
+ AxisFault fault = new AxisFault(
+ SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTimedout, internalSequenceID));
+ // Notify any waiting clients that the sequence has timeed out.
+ FaultManager.notifyClientsOfFault(internalSequenceID, storageManager, configurationContext, fault);
+
// Already an active transaction, so don't want a new one
- SequenceReport report = SandeshaClient.getOutgoingSequenceReport(internalSequenceID, configurationContext, false);
TerminateManager.timeOutSendingSideSequence(internalSequenceID, storageManager);
SandeshaListener listener = (SandeshaListener) messageContext
.getProperty(SandeshaClientConstants.SANDESHA_LISTENER);
if (listener != null) {
+ SequenceReport report = SandeshaClient.getOutgoingSequenceReport(internalSequenceID, configurationContext, false);
listener.onTimeOut(report);
}
}
Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java?view=diff&rev=509152&r1=509151&r2=509152
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java Mon Feb 19 02:50:09 2007
@@ -1,8 +1,18 @@
/*
- * Created on Sep 5, 2005
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
*/
package org.apache.sandesha2.util;
Added: webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java?view=auto&rev=509152
==============================================================================
--- webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java (added)
+++ webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java Mon Feb 19 02:50:09 2007
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.sandesha2.faulttests;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.ConfigurationContextFactory;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.sandesha2.SandeshaTestCase;
+import org.apache.sandesha2.client.SandeshaClient;
+import org.apache.sandesha2.client.SandeshaClientConstants;
+import org.apache.sandesha2.client.SequenceReport;
+import org.apache.sandesha2.policy.SandeshaPolicyBean;
+import org.apache.sandesha2.util.SandeshaUtil;
+
+public class SequenceTimedOutTest extends SandeshaTestCase {
+
+ public SequenceTimedOutTest() {
+ super("SequenceTimedOutTest");
+ }
+
+ public void setUp() throws Exception {
+ super.setUp();
+ }
+
+ public void tearDown() {
+
+ }
+
+ /**
+ * Test to check that when a sequence times out - that we alert the client to the
+ * fact that the sequence has now gone.
+ *
+ * @throws Exception
+ */
+ public void testSOAP11CreateSequenceRefusedInboundFault () throws Exception {
+
+ 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(echoAction);
+ clientOptions.setTo(new EndpointReference (to));
+
+ String sequenceKey = SandeshaUtil.getUUID();
+ clientOptions.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey);
+
+ ServiceClient serviceClient = new ServiceClient (configContext,null);
+
+
+ HashMap axisServices = configContext.getAxisConfiguration().getServices();
+
+ AxisService service = null;
+ Iterator values = axisServices.values().iterator();
+ while(values.hasNext())
+ service = (AxisService)values.next();
+
+ // Set the Sequence timout property to 1 second.
+ Iterator operations = service.getOperations();
+
+ while (operations.hasNext())
+ {
+ AxisOperation op = (AxisOperation) operations.next();
+ SandeshaPolicyBean propertyBean =
+ SandeshaUtil.getPropertyBean(op);
+
+ // Indicate that the sequence should timeout after 1 second
+ if (propertyBean != null)
+ propertyBean.setInactiveTimeoutInterval(1, "seconds");
+ }
+
+ // Set a bad acks to so the CreateSequence will be refused.
+ String acksTo = AddressingConstants.Final.WSA_NONE_URI;
+ clientOptions.setProperty(SandeshaClientConstants.AcksTo,acksTo);
+
+ clientOptions.setTransportInProtocol(Constants.TRANSPORT_HTTP);
+ clientOptions.setUseSeparateListener(true);
+ clientOptions.setProperty(SandeshaClientConstants.LAST_MESSAGE, "true");
+ serviceClient.setOptions(clientOptions);
+
+ TestCallback callback1 = new TestCallback ("Callback 1");
+ serviceClient.sendReceiveNonBlocking (getEchoOMBlock("echo1",sequenceKey),callback1);
+
+ long limit = System.currentTimeMillis() + waitTime;
+ Error lastError = null;
+ while(System.currentTimeMillis() < limit) {
+ Thread.sleep(tickTime); // Try the assertions each tick interval, until they pass or we time out
+
+ try {
+ //assertions for the out sequence.
+ SequenceReport sequenceReport = SandeshaClient.getOutgoingSequenceReport(serviceClient);
+ assertEquals(sequenceReport.getSequenceStatus(),SequenceReport.SEQUENCE_STATUS_TIMED_OUT);
+ assertEquals(sequenceReport.getSequenceDirection(),SequenceReport.SEQUENCE_DIRECTION_OUT);
+
+ assertTrue(callback1.isErrorRported());
+ assertEquals(callback1.getResult(),null);
+
+ lastError = null;
+ break;
+ } catch(Error e) {
+ lastError = e;
+ }
+ }
+
+ if(lastError != null) throw lastError;
+
+ configContext.getListenerManager().stop();
+ serviceClient.cleanup();
+
+ }
+
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org