我正在测试Spring状态机,尤其是我对应用状态机来管理我的对象的状态很感兴趣。
我的Statemachine的类型是StateMachine<EpisodeState, EpisodeEvent>
。
我的业务对象Episode
有一个类型为EpisodeState
的枚举属性(state
),它应该保存事件的状态机状态。我有一个批处理过程,它将在初始化时获得Statemachine的实例。我想遵循基本流程:
- 从数据库加载
Episode
- 从该
Episode
实例中的EpisodeState
设置Statemachine的当前状态 - 将事件发送到状态机
- 从Statemachine(post-event)获取结果状态,并在我的
Episode
实例中设置EpisodeState
- 保存
Episode
实例
文档提到了一个extendedState
属性,在我的测试中它是空的,但似乎支持任意对象的映射,我想我可以使用它来保存我的Episode
的主键,但我不知道如何将状态机的当前状态设置为Episode
中的EpisodeState
值。
我已经用StateMachineInterceptorAdapter<EpisodeState, EpisodeEvent>
配置了状态机,我可以在stateChange前/后、Transition前/后以及preEvent
中看到信息。
进一步研究(不是在Spring Statemachine文档中),我找到了一种设置状态机状态的方法:
假设您在一个名为startingState
的变量中有所需的开始状态,您可以这样做:
stateMachine.stop();
stateMachine
.getStateMachineAccessor()
.doWithAllRegions(access ->
access.resetStateMachine(new DefaultStateMachineContext<>(startingState, null, null, null)));
stateMachine.start();