状态机中的动态目标

时间:2011-02-28 12:47:47

标签: java state-machine scxml apache-commons-scxml

在使用SCXML制作的状态机中,有没有办法为转换设置动态目标值?

我的意思是,假设我有一个名为“obj”的对象,它已被设置为scxml的数据模型。因此,可以设置条件(如果对象中有一个名为checkCondition的属性),如:

cond =“obj.checkCondition”

<state id="state1">
    <transition cond="obj.checkCondition" target="state2"/>
</state>
<state id="state2">
    ...
</state>

我在obj中有另一个名为nextTarget的属性。我想在此过渡中设置目标,从对象中读取其值(在条件中完成)。

<state id="state1">
    <transition cond="obj.checkCondition" target="eval(obj.nextTarget)"/>
</state>
<!-- Where in obj.nextTarget there it has been set as value "state1", "state2" or any state name -->

有没有语法可以做到这一点?

感谢。

4 个答案:

答案 0 :(得分:2)

您可以在过渡元素中指定cond属性

<transition cond="data.value > 10" target="state2"/>

答案 1 :(得分:1)

SCXML是对状态的简单描述以及这些状态之间可能的转换。没有条件转换这样的东西。

但是,您可以从每个州进行多次转换。您从州获得的转换数量没有限制。

因此,您的问题的答案是,您需要尽可能多的转换来描述您希望的条件路线,并在其他地方(即使用Java)评估条件。

示例来源是SCXML Wikipedia entry

<state id="ready">
    <transition event="watch.start" target="running"/>
</state>
<state id="running">
    <transition event="watch.split" target="paused"/>
    <transition event="watch.stop" target="stopped"/>
</state>
<state id="paused">
    <transition event="watch.unsplit" target="running"/>
    <transition event="watch.stop" target="stopped"/>
</state>
<state id="stopped">
    <transition event="watch.reset" target="ready"/>
</state>

enter image description here

答案 2 :(得分:0)

您正在尝试构建非常面向应用程序的复杂状态机框架。这有点像为每个电子表格应用程序构建自己的电子表格框架而不是使用EXCEL。更好的方法可能是使用现有框架并在SCXML中定义事件和操作。您可以在www.StateSoft.org中看到SM API框架的示例 - &gt;国家机器馆。

-Janusz

答案 3 :(得分:0)

虽然@Charles Goodwin的答案非常精确......我可以加上我的话。简化:

  • 您的设计中包含的内容:您有一个转换 my_transition
  • 你想要的是:这种转变可能导致 几个state_targets

你完全隐藏了问题的逻辑。

你应该拥有什么:几个过渡

  • my_transition_A targetting state_A_target
  • my_transition_B targetting state_B_target
  • my_transition_C targetting state_C_target
  • my_transition_D targetting state_D_target ...

以及在您的设计中动态设置目标的过程将动态处理my_transition_A或my_transition_C的事件......就像它在您的设计中选择了target_state一样。)