Commons SCXML - принудительный переход в заданное состояние - PullRequest
2 голосов
/ 20 августа 2010

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

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

Ответы [ 2 ]

3 голосов
/ 20 августа 2010

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

2 голосов
/ 13 сентября 2013

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