Commons SCXML - Force de saut à un état donné
-
29-09-2019 - |
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.
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);
}