非常に単純なスプリングステートマシンをまとめようとしていますが、ステートを変更したくないようです。
(Spring Stateを使用していますが、マシン、およびアプリケーションの残りの春アプリです、私はマシンを定義するために、アノテーション駆動型のアプローチを使用することはできません。私はビルダーを使用する必要があります)スプリングステートマシンは状態を変更しません
StateMachineBuilder.Builder<String, String> builder = StateMachineBuilder.builder();
try {
builder.configureConfiguration()
.withConfiguration()
.beanFactory(new StaticListableBeanFactory())
.listener(new StateMachineListenerAdapter<String, String>() {
@Override
public void stateChanged(State<String, String> from, State<String, String> to) {
System.out.println("State change to " + to.getId());
}
});
builder.configureStates()
.withStates()
.initial("initialState")
.states(Stream.of("initialState", "state1", "state2", "state3").collect(Collectors.toSet()))
.end("state3");
builder.configureTransitions()
.withExternal()
.state("initialState")
.target("state1")
.event("event1")
.action(stateContext ->
System.out.println(String.format("Event %s triggered", stateContext.getEvent()))
);
} catch (Exception e) {
e.printStackTrace();
}
StateMachine<String, String> stateMachine = builder.build();
stateMachine.start();
boolean complete = stateMachine.isComplete();
System.out.println("Statemachine is complete: " + complete);
State<String, String> state = stateMachine.getState();
System.out.println(state.getId());
stateMachine.sendEvent("event1");
state = stateMachine.getState();
System.out.println(state.getId());
私は上記を実行すると、私がいることを期待しています最初の状態はinitialState
であり、イベントを送信すると、event1
の状態はstate1
に変更されます。
State change to initialState
Statemachine is complete: false
initialState
initialState
これは、リスナーが一度発生したときに、機械最初に起動し、初期状態を設定する私に語った、それが何らかの理由でそれが不完全な状態のマシンレポート、状態が私の前にinitialState
であること:私は次の出力を得ますイベントを送信した後、その状態はまだinitialState
です。
ステートマシンの起動時、またはイベントの送信時にエラーが発生せず、トランジションのアクションが実行されません。
私には何が欠けていますか?