On 2/6/07, Elam Birnbaum (ebirnbau) <[EMAIL PROTECTED]> wrote:
<snip/>

Ok, so let me see if I understand. You don't want to interrupt a state
machine while it is working, but you don't really know when the state
engine is working, which is why the concept of triggering events exists.
The events are processed by the engine when it has time to do so. Now,
the invoke, parentEvents, and cancel methods are all called by the state
engine (and hence the thread that is executing the engine) and the
engine blocks until these methods return. That means that when these
methods themselves trigger events the state engine must handle them
immediately  and would essentially give priority to those events and not
the events that the state engine has queued up. Not only that, but the
state engine will not register the ending of a state and the entrance of
another because it is handling the events in-line, which explains why I
saw so many parentEvents method calls.

That is why you want to be triggering events asynchronously, as
evidenced by the SimpleSCXMLInvoker class in the Commons SCXML project,
which triggers events in an asynchronous manner via the AsynchTrigger
class.

<snap/>

Mostly, yes. I'd add that its not the state machine engine (or any
part of the Commons SCXML code) giving priority to events triggered
synchronously within callbacks. Its already a deadlock (while it may
not manifest as such immediately), and also an attempt to
short-circuit any external event queues that the application may have
set up.



Normally I would think that you would want the state engine to stop
while the invoke process is running because that is what the state
engine should be doing at the time
<snip/>

Sure, thats when the state machine "comes to rest". More often than
not, the time a state machine instance is processing events is going
to be a (small) fraction of its total lifetime.


and the next state to visit will be
determined by the events triggered by the invoke. Any parallel states
would already be working in separate threads, so blocking in the invoke
should not cause parallel states to block. So the only reason I can see
for not wanting the invoke (and other methods) to take more than a
trivial amount of time is because the state engine could have events
waiting on it that would be prevented from being handled until the
invoke method returned. The only event I could think of that would be
triggered while the invoke method is being processed is the cancel
event, which you would want to actually stop the invoke process. Are
there any others?

<snap/>

Any application defined events (having parallel invoked processes,
sooner or later one will need some sort of IPC).



A couple of final notes. Since I was seeing this issue because I was not
triggering events in separate threads, I would recommend that Commons
SCXML either improve how events are triggered or update the
documentation regarding invoke to point out that fact as it is not
readily apparent.
<snip/>

Or both, atleast the docs, i.e. we need a section in the user guide
[1] devoted to invoke. If you want to write up some of your
observations, either via the site sources [2] or the wiki [3], that'd
be great too.


It would be great if the Commons SCXML
SCXMLExecutor.triggerEvent and triggerEvents methods automatically
spawned threads to actually trigger the events so that users won't have
to worry about doing it themselves. To add flexibility, perhaps a
setting in the SCXMLExecutor class could be exposed so the user can turn
on or off whether events are triggered in separate threads.

<snap/>

Correct, its a trade-off between complexity in the library (and some
may say code smell with boolean flags) and developer discipline. We
definitely do not want to spawn threads without an option not to (when
it is deemed unnecessary, or inappropriate). Could be mitigated by
documentation.


I will look to see if Jira has an option for feature requests so I can
put that in.

<snip/>

Sure, when you try to create a new issue, you can label it as a "Bug"
or "Improvement" or "Task" etc. (I think there are a couple of
others).

-Rahul

[1] http://jakarta.apache.org/commons/scxml/guide.html
[2] http://svn.apache.org/repos/asf/jakarta/commons/proper/scxml/trunk/xdocs/
[3] http://wiki.apache.org/jakarta-commons/SCXML


Thanks again,

Elam Birnbaum


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to