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