Author: chathura_ce
Date: Sat Apr 28 23:38:58 2007
New Revision: 533471
URL: http://svn.apache.org/viewvc?view=rev&rev=533471
Log:
Fixed a concurrent issue in the callbackStore's iterator access.
Modified:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/TimeoutHandler.java
Modified:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/TimeoutHandler.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/TimeoutHandler.java?view=diff&rev=533471&r1=533470&r2=533471
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/TimeoutHandler.java
(original)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/TimeoutHandler.java
Sat Apr 28 23:38:58 2007
@@ -74,40 +74,46 @@
// checks if callback store contains at least one entry before
proceeding. otherwise getting
// the time for doing nothing would be a inefficient task.
- if (callbackStore.size() > 0) {
- long currentTime = currentTime();
+ // we have to synchronize this on the callbackStore as iterators of
thread safe collections
+ // are not thread safe. callbackStore can be modified concurrently by
the SynapseCallbackReceiver.
+ synchronized(callbackStore) {
- Iterator i = callbackStore.keySet().iterator();
+ if (callbackStore.size() > 0) {
- while (i.hasNext()) {
- Object key = i.next();
- AsyncCallback callback = (AsyncCallback)
callbackStore.get(key);
+ long currentTime = currentTime();
- if (callback.getTimeOutAction() != Constants.NONE) {
+ Iterator i = callbackStore.keySet().iterator();
- if (callback.getTimeOutOn() <= currentTime) {
- callbackStore.remove(key);
+ while (i.hasNext()) {
+ Object key = i.next();
+ AsyncCallback callback = (AsyncCallback)
callbackStore.get(key);
- if (callback.getTimeOutAction() ==
Constants.DISCARD_AND_FAULT) {
+ if (callback.getTimeOutAction() != Constants.NONE) {
- // actiavte the fault sequence of the current
sequence mediator
+ if (callback.getTimeOutOn() <= currentTime) {
+ callbackStore.remove(key);
- MessageContext msgContext =
callback.getSynapseOutMsgCtx();
+ if (callback.getTimeOutAction() ==
Constants.DISCARD_AND_FAULT) {
- // add an error code to the message context, so
that error sequences
- // can identify the cause of error
- msgContext.setProperty(Constants.ERROR_CODE,
Constants.TIME_OUT);
+ // actiavte the fault sequence of the current
sequence mediator
- Stack faultStack = msgContext.getFaultStack();
+ MessageContext msgContext =
callback.getSynapseOutMsgCtx();
- for (int j = 0; j < faultStack.size(); j++) {
- Object o = faultStack.pop();
- if (o instanceof MediatorFaultHandler) {
- ((MediatorFaultHandler)
o).handleFault(msgContext);
+ // add an error code to the message context,
so that error sequences
+ // can identify the cause of error
+ msgContext.setProperty(Constants.ERROR_CODE,
Constants.TIME_OUT);
+
+ Stack faultStack = msgContext.getFaultStack();
+
+ for (int j = 0; j < faultStack.size(); j++) {
+ Object o = faultStack.pop();
+ if (o instanceof MediatorFaultHandler) {
+ ((MediatorFaultHandler)
o).handleFault(msgContext);
+ }
}
- }
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]