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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to