java - Apache Commons SCXML 状态机框架

标签 java apache-commons


我正在尝试使用 Apache SCXML 为 Java 应用程序定义状态机。但是,我遇到了问题,我不确定这是由于 SCXML 框架还是我做错了什么。
我的测试应用程序基于以下示例(没有 android 位):
http://commons.apache.org/scxml/usecases/scxml-stopwatch-on-android.html

文件 StopWatch.java ( http://commons.apache.org/scxml/xref-test/org/apache/commons/scxml/env/StopWatch.html )

public class StopWatch extends AbstractStateMachine {
    public void reset() {

    }

    public void running() {
    }

    public void paused() {
    }

    public void stopped() {
    }
}

问题是上述状态每次转换仅调用一次。它是否正确?只要状态机保持在给定状态,状态函数不就应该被连续调用吗?

谢谢!

最佳答案

您好,以防万一其他人发现这个问题。

上面的示例仅适用于定义的 state machine 的上下文中示例。

状态不会自动转换,因为它们受到事件的保护。因此,只有当状态机处于状态 A 并且定义的转换事件被触发时,状态机才会前进。这可以在下面的代码片段中看到

<state id="reset">
    <transition event="watch.start" target="running"/>
</state>

作为补充说明,与 StopWatch 示例中定义的状态同名的方法的执行由 AbstractStateMachine 本身中定义的 EventListener 保护。 作为初始化方法的一部分,注册了一个新的监听器。

engine.addListener(stateMachine, new EntryListener());

该监听器调用对应状态名称onEntry的方法进入新状态

public void onEntry(final TransitionTarget entered) {
    invoke(entered.getId());
}

因此,如果您希望连续调用状态,只需删除状态机(SCXML)描述中的转换防护即可。

关于java - Apache Commons SCXML 状态机框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410539/

相关文章:

java - 如何将字母附加到资源文件

java.lang.AbstractMethodError : com. mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;)V

java - 为什么 sbt run 工作时 Apache Common 依赖项在 sbt-onejar 下发生冲突?

java - Base64 编码器未编码 UTF-8

java - Apache Common MultiValueMap 迭代

java - Apache通用数学中是否有静态函数来评估高斯函数

java - 应用程序重启后 Room Empty Db

java - 在哪个平台上开发基于网络的游戏?

java - JSF - JUnit FacesContext 模拟测试

java - Apache Commons 成像 (EXIF) : Setting tags/tags missing