Author: ate Date: Sun Sep 7 19:48:46 2014 New Revision: 1623146 URL: http://svn.apache.org/r1623146 Log: SCXML-206: External events must only be added to the event queue through SCXMLExecutor#addEvent, not (also) trigger them, as the state machine can/should only handle one invocation at the time (non-reentrant). The event queue processing with sequentially processed such added events one at a time.
Modified: commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/env/SimpleScheduler.java commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java Modified: commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java?rev=1623146&r1=1623145&r2=1623146&view=diff ============================================================================== --- commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java (original) +++ commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java Sun Sep 7 19:48:46 2014 @@ -370,9 +370,7 @@ public class SCXMLExecutor implements SC */ public void triggerEvent(final TriggerEvent evt) throws ModelException { - if (evt != null) { - externalEventQueue.add(evt); - } + addEvent(evt); triggerEvents(); } @@ -390,9 +388,7 @@ public class SCXMLExecutor implements SC throws ModelException { if (evts != null) { for (TriggerEvent evt : evts) { - if (evt != null) { - externalEventQueue.add(evt); - } + addEvent(evt); } } triggerEvents(); @@ -437,5 +433,4 @@ public class SCXMLExecutor implements SC log.debug(sb.toString()); } } -} - +} \ No newline at end of file Modified: commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/env/SimpleScheduler.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/env/SimpleScheduler.java?rev=1623146&r1=1623145&r2=1623146&view=diff ============================================================================== --- commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/env/SimpleScheduler.java (original) +++ commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/env/SimpleScheduler.java Sun Sep 7 19:48:46 2014 @@ -126,13 +126,7 @@ public class SimpleScheduler implements if (log.isWarnEnabled()) { log.warn("<send>: Unavailable target - " + target); } - try { - this.executor.triggerEvent(new TriggerEvent( - EVENT_ERR_SEND_TARGETUNAVAILABLE, - TriggerEvent.ERROR_EVENT)); - } catch (ModelException me) { - log.error(me.getMessage(), me); - } + this.executor.addEvent(new TriggerEvent(EVENT_ERR_SEND_TARGETUNAVAILABLE,TriggerEvent.ERROR_EVENT)); return; // done } @@ -232,12 +226,7 @@ public class SimpleScheduler implements @Override public void run() { timers.remove(sendId); - try { - executor.triggerEvent(new TriggerEvent(event, - TriggerEvent.SIGNAL_EVENT, payload)); - } catch (ModelException me) { - log.error(me.getMessage(), me); - } + executor.addEvent(new TriggerEvent(event, TriggerEvent.SIGNAL_EVENT, payload)); if (log.isDebugEnabled()) { log.debug("Fired event '" + event + "' as scheduled by " + "<send> with id '" + sendId + "'"); Modified: commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java?rev=1623146&r1=1623145&r2=1623146&view=diff ============================================================================== --- commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java (original) +++ commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java Sun Sep 7 19:48:46 2014 @@ -125,11 +125,7 @@ public class SimpleSCXMLInvoker implemen return; // no further processing should take place } boolean doneBefore = executor.getCurrentStatus().isFinal(); - try { - executor.triggerEvent(evt); - } catch (ModelException me) { - throw new InvokerException(me.getMessage(), me.getCause()); - } + executor.addEvent(evt); if (!doneBefore && executor.getCurrentStatus().isFinal()) { TriggerEvent te = new TriggerEvent("done.invoke."+parentStateId,TriggerEvent.SIGNAL_EVENT); new AsyncTrigger(parentIOProcessor, te).start(); @@ -142,11 +138,7 @@ public class SimpleSCXMLInvoker implemen public void cancel() throws InvokerException { cancelled = true; - try { - executor.triggerEvent(new TriggerEvent("cancel.invoke."+parentStateId, TriggerEvent.CANCEL_EVENT)); - } catch (ModelException me) { - throw new InvokerException(me.getMessage(), me.getCause()); - } + executor.addEvent(new TriggerEvent("cancel.invoke."+parentStateId, TriggerEvent.CANCEL_EVENT)); } }