Pregunta

Estoy utilizando Apache Commons SCXML , y me gustaría saber si es posible decirle a la máquina de estados (SCXMLExecutor) para saltar a un estado determinado.

No se puede utilizar el atributo initialstate, porque quiero que la máquina de estados para recuperar (es decir, desde fallas de energía), y lo único que tengo es el último estado. Es por eso que yo estaba pensando en decirle a la máquina de estados para hacer un salto directo a la misma.

¿Fue útil?

Solución

En el caso general es una muy mala idea para saltar a un estado sin la máquina de estado que es "consciente" de ella, porque puede haber condiciones previas para la ejecución de un estado particular que no está satisfecho (que sería si usted alcanzó el estado del) manera "normal". Una mejor idea es diseñar la máquina de estados con una capacidad de "reinicio", implementados como un evento de entrada "reinicio" y los estados y las transiciones necesarias para manejar la situación.

Otros consejos

Esta es una vieja pregunta, pero me acaba de golpear esto y necesitaba una respuesta a él también y pensó que podría ayudar a los demás a responder a ella. Estoy usando esto como parte de la unidad de pruebas, en las que es extremadamente útil para obtener sólo a un estado particular (Quiero estar seguro de que si en el estado A, si una secuencia de eventos ocurre, pasa al estado B - y todavía va allí después de que jugar con la máquina de estado XML!)

Finalmente encontré este código en SCXMLTestHelper y funcionó. Sólo tiene que llamar con el ejecutor y el estado de destino.

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top