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