Apache Commons SCXMLを使用していますが、ステートマシン(SCXMLExecutor)に特定の状態にジャンプするように指示できるかどうかを知りたいです。
initialstate
ステートマシンを(つまり、電源障害から)回復させたいので、属性を使用できません。私が持っているのは最後の状態だけです。そのため、ステートマシンに直接ジャンプするように指示することを考えていました。
Apache Commons SCXMLを使用していますが、ステートマシン(SCXMLExecutor)に特定の状態にジャンプするように指示できるかどうかを知りたいです。
initialstate
ステートマシンを(つまり、電源障害から)回復させたいので、属性を使用できません。私が持っているのは最後の状態だけです。そのため、ステートマシンに直接ジャンプするように指示することを考えていました。
一般的なケースでは、ステートマシンがその状態を「認識」せずに状態にジャンプすることは非常に悪い考えです。これは、特定の状態の実行の前提条件が満たされていない可能性があるためです(つまり、状態に達した場合は「通常の」)方法。より良いアイデアは、入力「再起動」イベントとして実装された「再起動」機能と、それを処理するために必要な状態と遷移を備えたステートマシンを設計することです。
これは古い質問ですが、私はこれをヒットし、それに対する答えも必要であり、他の人がそれに答えるのに役立つかもしれないと思いました。私はこれを単体テストの一部として使用しています。特定の状態に到達するだけで非常に便利です(状態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);
}