You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by ga...@apache.org on 2007/02/19 12:04:09 UTC

svn commit: r509158 - in /webservices/sandesha/trunk/java/src/org/apache/sandesha2: storage/beans/InvokerBean.java util/TerminateManager.java workers/InvokerWorker.java

Author: gatfora
Date: Mon Feb 19 03:04:07 2007
New Revision: 509158

URL: http://svn.apache.org/viewvc?view=rev&rev=509158
Log:
Remove deadlock between Invoker and InvokerWorker over InvokerBeans and RMDBeans.  Removed the invoked flag from the InvokerBean as it isn't used.

Modified:
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/InvokerBean.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/InvokerWorker.java

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/InvokerBean.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/InvokerBean.java?view=diff&rev=509158&r1=509157&r2=509158
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/InvokerBean.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/InvokerBean.java Mon Feb 19 03:04:07 2007
@@ -46,20 +46,12 @@
 	private long msgNo;
 
 	/**
-	 * Comment for <code>invoked</code>
-	 * Weather the message has been invoked by the invoker.
-	 */
-	private boolean invoked = false;
-	
-	/**
 	 * Flags that are used to check if the primitive types on this bean
 	 * have been set. If a primitive type has not been set then it will
 	 * be ignored within the match method.
 	 */
 	private int flags = 0;
-	private static final int MSG_NO_FLAG  = 0x00000001;
-	private static final int INVOKED_FLAG = 0x00000010;
-	
+	private static final int MSG_NO_FLAG  = 0x00000001;	
 	
 	public InvokerBean() {
 
@@ -116,22 +108,12 @@
 	public void setSequenceID(String sequenceId) {
 		this.sequenceID = sequenceId;
 	}
-	
-	public boolean isInvoked() {
-		return invoked;
-	}
-	
-	public void setInvoked(boolean invoked) {
-		this.invoked = invoked;
-		this.flags |= INVOKED_FLAG;
-	}
-	
+
 	public String toString() {
 		StringBuffer result = new StringBuffer();
 		result.append(this.getClass().getName());
 		result.append("\nSequence Id: "); result.append(sequenceID);
 		result.append("\nMsg Number : "); result.append(msgNo);
-		result.append("\nInvoked    : "); result.append(invoked);
 		result.append("\nMessage Key: "); result.append(messageContextRefKey);
 		return result.toString();
 	}
@@ -147,9 +129,6 @@
 			select = false;
 
 		else if ((bean.flags & MSG_NO_FLAG) != 0 && bean.getMsgNo() != this.getMsgNo())
-			select = false;
-		
-		else if ((bean.flags & INVOKED_FLAG) != 0 && bean.isInvoked() != this.isInvoked())
 			select = false;
 		
 		return select;

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=509158&r1=509157&r2=509158
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/TerminateManager.java Mon Feb 19 03:04:07 2007
@@ -172,25 +172,22 @@
 	 */
 	public static void cleanReceivingSideAfterInvocation(ConfigurationContext configContext, String sequenceId,
 			StorageManager storageManager) throws SandeshaException {
-		InvokerBeanMgr storageMapBeanMgr = storageManager.getInvokerBeanMgr();
+		if(log.isDebugEnabled()) log.debug("Enter: TerminateManager::cleanReceivingSideAfterInvocation " +sequenceId);
+		
+		InvokerBeanMgr invokerBeanMgr = storageManager.getInvokerBeanMgr();
 
-		// removing storageMap entries
-		InvokerBean findStorageMapBean = new InvokerBean();
-		findStorageMapBean.setSequenceID(sequenceId);
-		findStorageMapBean.setInvoked(true);
-		Collection collection = storageMapBeanMgr.find(findStorageMapBean);
+		// removing InvokerBean entries
+		InvokerBean invokerFindBean = new InvokerBean();
+		invokerFindBean.setSequenceID(sequenceId);
+		Collection collection = invokerBeanMgr.find(invokerFindBean);
 		Iterator iterator = collection.iterator();
 		while (iterator.hasNext()) {
-			InvokerBean storageMapBean = (InvokerBean) iterator.next();
-			storageMapBeanMgr.delete(storageMapBean.getMessageContextRefKey());
+			InvokerBean invokerBean = (InvokerBean) iterator.next();
+			String messageStoreKey = invokerBean.getMessageContextRefKey();
+			invokerBeanMgr.delete(messageStoreKey);
 
 			// removing the respective message context from the message store.
-			// If this is an in-only message.
-			// In-out message will be deleted when a ack is retrieved for the
-			// out message.
-			String messageStoreKey = storageMapBean.getMessageContextRefKey();
 			storageManager.removeMessageContext(messageStoreKey);
-
 		}
 
 		String cleanStatus = (String) receivingSideCleanMap.get(sequenceId);
@@ -199,6 +196,8 @@
 		else {
 			receivingSideCleanMap.put(sequenceId, CLEANED_AFTER_INVOCATION);
 		}
+		
+		if(log.isDebugEnabled()) log.debug("Exit: TerminateManager::cleanReceivingSideAfterInvocation");
 	}
 
 	/**

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/InvokerWorker.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/InvokerWorker.java?view=diff&rev=509158&r1=509157&r2=509158
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/InvokerWorker.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/InvokerWorker.java Mon Feb 19 03:04:07 2007
@@ -15,7 +15,6 @@
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.InvokerBeanMgr;
-import org.apache.sandesha2.storage.beanmanagers.RMDBeanMgr;
 import org.apache.sandesha2.storage.beans.InvokerBean;
 import org.apache.sandesha2.storage.beans.RMDBean;
 import org.apache.sandesha2.util.MsgInitializer;
@@ -47,16 +46,12 @@
 			
 			StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext,configurationContext.getAxisConfiguration());
 			InvokerBeanMgr invokerBeanMgr = storageManager.getInvokerBeanMgr();
-			RMDBeanMgr nextMsgMgr = storageManager.getRMDBeanMgr();
 			
 			//starting a transaction
 			transaction = storageManager.getTransaction();
 			
 			InvokerBean invokerBean = invokerBeanMgr.retrieve(messageContextKey);
 			
-			String sequenceId = invokerBean.getSequenceID();
-			long messageNo = invokerBean.getMsgNo();
-			
 			msgToInvoke = storageManager.retrieveMessageContext(messageContextKey, configurationContext);
 			RMMsgContext rmMsg = MsgInitializer.initializeMessage(msgToInvoke);
 
@@ -103,15 +98,7 @@
 				
 			//starting a transaction for the post-invocation work.
 			transaction = storageManager.getTransaction();
-			
-			// Service will be invoked only once. I.e. even if an
-			// exception get thrown in invocation
-			// the service will not be invoked again.
-			invokerBeanMgr.delete(messageContextKey);
-
-			// removing the corresponding message context as well.
-			storageManager.removeMessageContext(messageContextKey);
-			
+						
 			if (rmMsg.getMessageType() == Sandesha2Constants.MessageTypes.APPLICATION) {
 				Sequence sequence = (Sequence) rmMsg
 						.getMessagePart(Sandesha2Constants.MessageParts.SEQUENCE);
@@ -121,18 +108,18 @@
 					//this will work for RM 1.0 only
 					highestMessage = true;
 				} else {
-					RMDBean rmdBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, sequenceId);
+					RMDBean rmdBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, invokerBean.getSequenceID());
 					
 					if (rmdBean!=null && rmdBean.isTerminated()) {
 						long highestInMsgNo = rmdBean.getHighestInMessageNumber();
-						if (messageNo==highestInMsgNo)
+						if (invokerBean.getMsgNo()==highestInMsgNo)
 							highestMessage = true;
 					}
 				}
 				
 				if (highestMessage) {
 					//do cleaning stuff that hs to be done after the invocation of the last message.
-					TerminateManager.cleanReceivingSideAfterInvocation(configurationContext, sequenceId, storageManager);
+					TerminateManager.cleanReceivingSideAfterInvocation(configurationContext, invokerBean.getSequenceID(), storageManager);
 					// exit from current iteration. (since an entry
 					// was removed)
 					if(log.isDebugEnabled()) log.debug("Exit: InvokerWorker::run Last message return");					
@@ -140,19 +127,27 @@
 				}
 			}
 			
+			// Service will be invoked only once. I.e. even if an
+			// exception get thrown in invocation
+			// the service will not be invoked again.
+			invokerBeanMgr.delete(messageContextKey);
+
+			// removing the corresponding message context as well.
+			storageManager.removeMessageContext(messageContextKey);
+			
 			if(!ignoreNextMsg){
 				// updating the next msg to invoke
-				RMDBean rMDBean = nextMsgMgr.retrieve(sequenceId);
+				RMDBean rMDBean = storageManager.getRMDBeanMgr().retrieve(invokerBean.getSequenceID());
 				long nextMsgNo = rMDBean.getNextMsgNoToProcess();
 				
-				if (!(messageNo==nextMsgNo)) {
+				if (!(invokerBean.getMsgNo()==nextMsgNo)) {
 					String message = "Operated message number is different from the Next Message Number to invoke";
 					throw new SandeshaException (message);
 				}
 				
 				nextMsgNo++;
 				rMDBean.setNextMsgNoToProcess(nextMsgNo);
-				nextMsgMgr.update(rMDBean);
+				storageManager.getRMDBeanMgr().update(rMDBean);
 			}
 		} catch (Exception e) {
 			if (log.isErrorEnabled())



---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org