Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Fixed
-
0.6
-
None
-
all platforms
Description
With the following code
public class HazInvoker implements Invoker
{
@Override public void invoke(String source, Map parameters) throws InvokerException
{
System.out.println("Invoker invoke source: "source" params: "+parameters);
SCXMLExecutor executor = scInstance.getExecutor();
TriggerEvent event=new TriggerEvent(parentStateId+".invoker.done", TriggerEvent.SIGNAL_EVENT);
//new AsyncTrigger(executor, event);
try
catch (ModelException ex)
{ ex.printStackTrace(); }}
Exception in thread "main" java.lang.StackOverflowError
at java.util.Vector.addElement(Vector.java:573)
at java.util.Stack.push(Stack.java:50)
...
at org.apache.commons.scxml.semantics.SCXMLSemanticsImpl.initiateInvokes(SCXMLSemanticsImpl.java:824)
at org.apache.commons.scxml.SCXMLExecutor.triggerEvents(SCXMLExecutor.java:142)
at org.apache.commons.scxml.SCXMLExecutor.triggerEvent(SCXMLExecutor.java:160)
at com.hazlorealidad.fsm.HazInvoker.invoke(HazInvoker.java:37)
at org.apache.commons.scxml.semantics.SCXMLSemanticsImpl.initiateInvokes(SCXMLSemanticsImpl.java:824)
at org.apache.commons.scxml.SCXMLExecutor.triggerEvents(SCXMLExecutor.java:142)
at org.apache.commons.scxml.SCXMLExecutor.triggerEvent(SCXMLExecutor.java:160)
at com.hazlorealidad.fsm.HazInvoker.invoke(HazInvoker.java:37)
The fix is to use the AsyncTrigger but the class is package private, I would be good to change it to public and document the way to write a synchronous invoker in the invoke method.
Something like:
"If the Invoker completes its invocation in the invoke method it should signal the completion of the task using an AsyncTrigger, in order to avoid a stack overflow"
Or maybe there is another solution which would allow the event to be fired in the invoke method.
Also it would be good to avoid the creation of a thread just for that, maybe an invokeLater method in the executor, like the swing dispatch loop.