Frage

Ich bin mit Apache Commons SCXML , und ich würde gerne wissen, ob es möglich ist, sagt der Zustandsmaschine (SCXMLExecutor) in einen bestimmten Zustand zu springen.

Ich kann das initialstate Attribut verwenden, weil ich die Zustandsmaschine (das heißt von Stromausfällen) wiederherstellen möge, und das einzige, was ich habe, ist der letzte Zustand. Deshalb dachte ich an die Zustandsmaschine zu sagen einen direkten Sprung, um es zu machen.

War es hilfreich?

Lösung

Im allgemeinen Fall ist es eine wirklich schlechte Idee, einen Zustand zu springen, ohne die Zustandsmaschine der „bewusst“ es ist, weil es möglicherweise Voraussetzungen für einen bestimmten Zustand der Ausführung sein, die nicht erfüllt sind (das wäre, wenn Sie erreicht der Zustand der „normale“) Art und Weise. Eine bessere Idee ist es, die Zustandsmaschine mit einer „Neustart“ Fähigkeit zu entwerfen, als Eingang „Neustart“ -Ereignis durchgeführt und die Zustände und Übergänge notwendig, sie zu behandeln.

Andere Tipps

Dies ist eine alte Frage, aber ich traf nur dies und brauchte eine Antwort darauf, wie gut und dachte, es könnte andere helfen, sie zu beantworten. Ich benutze dies als Teil der Unit-Tests, wo es äußerst nützlich ist, nur auf einen bestimmten Zustand (ich will sicher sein, dass, wenn im Zustand A, wenn eine Abfolge von Ereignissen geschieht, geht es in dem Zustand B - und immer noch gehe dort, nachdem ich bastle mit der Zustandsmaschine XML!)

Schließlich fand ich diesen Code in SCXMLTestHelper und es funktionierte. nennen Sie es einfach mit dem Testamentsvollstrecker und der Zielzustand.

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top