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]