Commons SCXML - 强制跳转到给定状态

时间:2010-08-19 21:15:11

标签: java scxml apache-commons-scxml

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 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);
}