Question

J'utilise Apache Commons SCXML , et je voudrais savoir s'il est possible de dire la machine d'état (SCXMLExecutor) pour passer à un état donné.

Je ne peux pas utiliser l'attribut initialstate, parce que je veux la machine d'état pour récupérer (à savoir des coupures de courant), et la seule chose que j'ai est le dernier état. Voilà pourquoi je pensais à dire la machine d'état de faire un saut directement.

Était-ce utile?

La solution

Dans le cas général, il est vraiment une mauvaise idée de passer à un état sans peut-être de la machine d'état d'être « au courant » de celui-ci, parce qu'il ya des conditions préalables à l'exécution d'un état particulier qui ne sont pas satisfaits (ce serait si vous atteigniez l'état de la façon « normale »). Une meilleure idée est de concevoir la machine d'état avec un événement « redémarrage » capacité, mis en œuvre en tant qu'entrée « restart » et les états et les transitions nécessaires pour y faire face.

Autres conseils

Ceci est une vieille question, mais je frappe cela et avait besoin d'une réponse à lui aussi bien et a pensé qu'il pourrait aider les autres à y répondre. J'utilise ce dans le cadre des tests unitaires, où il est extrêmement utile pour obtenir juste à un état particulier (je veux être sûr que si à l'état A, si une séquence d'événements se produit, il passe à l'état B - et se poursuit encore il après que je bricoler avec le XML machine d'état!)

Je trouve enfin ce code dans SCXMLTestHelper et cela a fonctionné. Il suffit d'appeler avec l'exécuteur testamentaire et l'état de destination.

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top