Commons SCXML — принудительный переход в заданное состояние

Я использую Apache Commons SCXML и хотел бы знать, можно ли узнать состояние машина (SCXMLExecutor) для перехода в заданное состояние.

Я не могу использовать атрибут initialstate, потому что я хочу, чтобы конечный автомат восстановился (т.е. от сбоев питания), и единственное, что у меня есть, это последнее состояние. Вот почему я подумал о том, чтобы сказать машине состояний сделать прямой переход к ней.


person Guido    schedule 19.08.2010    source источник


Ответы (2)


В общем случае очень плохая идея переходить в состояние без «знания» об этом конечного автомата, потому что могут быть предварительные условия для выполнения определенного состояния, которые не выполняются (это было бы, если бы вы достигли состояния, в котором конечный автомат «знает» об этом). "нормальный") способ. Лучшая идея состоит в том, чтобы спроектировать конечный автомат с возможностью «перезагрузки», реализованной как входное событие «перезагрузка», а также состояния и переходы, необходимые для его обработки.

person Jim Garrison    schedule 19.08.2010
comment
Хорошая идея. Благодарим за Ваш ценный отзыв. - person Guido; 20.08.2010

Это старый вопрос, но я только что наткнулся на него, и мне тоже нужен был ответ на него, и я подумал, что это может помочь другим ответить на него. Я использую это как часть модульного тестирования, где Чрезвычайно полезно просто добраться до определенного состояния (я хочу быть уверенным, что если в состоянии 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);
}
person Evan Reynolds    schedule 12.09.2013