0

我在我的项目中使用 Apache commons SCXML 来维护状态机。一旦执行到定义调用程序的状态的转换,我们就使用调用程序执行一些活动。

当调用者从同一状态调用两次时,问题就来了。例如,从状态“A”触发事件“TEMP”,然后它移动到状态“B”。并且一旦它进入状态“B”调用者被调用并且调用者类的回调方法invoke()被调用。

<state id="A">
    <transition event="TEMP" target="B"></transition>
</state>

<state id="B">
    <invoke src="INVOKER" targettype="invoker-req">
        <transition event="FAIL" target="A"></transition>
        <transition event="SUCC" target="C"></transition>
    </invoke>
</state>

当从状态 A 再次触发事件“TEMP”并且没有调用 Invoker 时,问题就来了。invoke() 方法不再被调用。调用者只能调用一次吗?

请让我知道如何再次调用调用者/调用()。我在互联网上没有得到太多帮助。

提前致谢。

4

1 回答 1

0

我不确定 apache-commons 实现的细节,但是 SCXML 规范要求调用者在其包含状态在宏步骤结束时处于活动配置时被调用,并且当该状态不再处于活动配置中时不被调用在宏步结束时。因此,无论您来自哪个状态,都只能运行一个调用程序实例。

但是,您可以做的是在父状态下启动调用程序,并在 onentry 块中发送事件,其 id 为 #_target。您可以发送任意数量的事件,并将应用程序代码从调用程序实例化移动到事件的接收。

于 2014-07-23T11:05:49.137 回答