具有JPA持久性的Spring状态机-存储库使用



我正试图弄清楚如何轻松地使用spring状态机,包括JPA的持久性。这就是我正在处理的问题:

不兼容的数据类型-工厂和持久性

在程序的某一点上,我想使用连接到用户的状态机。有用于此目的的存储库(项目spring-statemachine-data-jpa(。首先,使用存储库检查玩家的状态机是否已经存在。如果没有,创建一个新的状态机并将其持久化。

问题是我有不同类型的状态机。工厂创建一个StateMachine<UserState, UserEvent>,存储库返回一个JpaRepositoryStateMachine。它们彼此不兼容,对我来说,不清楚如何持久化/创建/恢复状态机。

你能帮我澄清一下吗?

@Autowired
private StateMachineRepository<JpaRepositoryStateMachine> repository;
public someMethod(User user) {
Optional<JpaRepositoryStateMachine> stateMachine = repository.findById(user.getId()); // JPA state machine
if(stateMachine.isEmpty()) {
StateMachine<UserState, UserEvent> createdStateMachine = factory.getStateMachine(user.getId()); // spring state machine
repository.save(createdStateMachine); // compile error
}
// here: ready-to-use statemachine - how?
}

谢谢你的帮助!

尝试使用SpringStateMachineService获取状态机实例,而不是从存储库或工厂显式检索它。您可以使用Spring提供的默认实现:

@Bean
public StateMachineService<State, Event> stateMachineService(
final StateMachineFactory<State, Event> stateMachineFactory,
final StateMachinePersist<WorkflowState, WorkflowEvent, String> stateMachinePersist) {
return new DefaultStateMachineService<>(stateMachineFactory, stateMachinePersist);
}

因此,您的代码将看起来像:

@Autowired
private StateMachineService<State, Event> stateMachineService;
public someMethod(User user) {
StateMachine<State, Event> stateMachine = stateMachineService.acquireStateMachine(user.getId(), false);
// here: ready-to-use statemachine - call stateMachine.start() for example
}

如果您进入acquireStateMachine方法,您可以看到它按id从存储库中查询状态机,如果没有找到,则创建一个新的状态机。

您可以使用JpaPersistingStateMachineInterceptor在每次更改时隐式保存和更新状态机实例。

@Bean
public JpaPersistingStateMachineInterceptor<State, Event, String>
jpaPersistingStateMachineInterceptor() {
return new JpaPersistingStateMachineInterceptor(stateMachineRepository);
}

请参阅持久状态机

相关内容

  • 没有找到相关文章

最新更新