【问题标题】:Commons SCXML - Force jump to a given stateCommons SCXML - 强制跳转到给定状态
【发布时间】:2010-08-19 21:15:11
【问题描述】:

我正在使用Apache Commons SCXML,我想知道是否可以告诉状态机 (SCXMLExecutor) 跳转到给定状态。

我不能使用initialstate 属性,因为我希望状态机恢复(即从电源故障中恢复),而我唯一拥有的是最后一个状态。这就是为什么我在考虑让状态机直接跳转到它。

【问题讨论】:

    标签: java scxml apache-commons-scxml


    【解决方案1】:

    在一般情况下,在状态机没有“意识到”的情况下跳转到一个状态是一个非常糟糕的主意,因为可能存在不满足特定状态执行的先决条件(如果你达到状态“正常”)方式。更好的想法是设计具有“重启”功能的状态机,实现为输入“重启”事件以及处理它所需的状态和转换。

    【讨论】:

    • 好主意。感谢您的宝贵反馈。
    【解决方案2】:

    这是一个老问题,但我刚刚打了这个,也需要一个答案,并认为它可能会帮助其他人回答它。我将其用作单元测试的一部分,在这种情况下,仅进入特定状态非常有用(我想确保如果在状态 A,如果发生一系列事件,它会进入状态 B - 并且仍然会继续在我修改状态机 XML 之后!)

    我终于在 SCXMLTestHelper 中找到了这段代码,并且成功了。只需使用执行器和目标状态调用它即可。

    public static void setCurrentState(SCXMLExecutor exec, final String id) throws IllegalArgumentException{
        try {
            exec.reset();
        } catch (ModelException me) {
            throw new IllegalArgumentException("Provided SCXMLExecutor "
                    + "instance cannot be reset.");
        }
        TransitionTarget active = (TransitionTarget) exec.getStateMachine().
                getTargets().get(id);
        if (active == null) {
            throw new IllegalArgumentException("No target with id '" + id
                    + "' present in state machine.");
        }
        Set current = exec.getCurrentStatus().getStates();
        current.clear();
        current.add(active);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多