Я создаю проект, которому нужен FSM, и я выбираю Spring State Machine, чтобы помочь мне решить проблему. Я использую JPA и пытаюсь понять, как запустить конечный автомат на основе моего текущего состояния, извлекая состояние из репозитория JPA. Я нашел в документации этот подход: конечный автомат сохранить
Но я тоже смущаюсь в этом подходе: конечный автомат
Я не пытаюсь сохранить всю конфигурацию конечного автомата, а только запускаю и отправляю события на основе статуса моего объекта. но в обоих случаях я не знаю, как поместить репозиторий jpa, чтобы найти мое текущее состояние.
Теперь я пробую этот подход:
class StateMachineAdapter<S, E, T> {
lateinit var stateMachineFactory: StateMachineFactory<S, E>
lateinit var persister: StateMachinePersister<S, E, T>
fun stateMachineRestore(contextObject: T): StateMachine<S, E> {
val stateMachine: StateMachine<S, E> = stateMachineFactory.getStateMachine()
return persister.restore(stateMachine, contextObject)
}
fun persist(stateMachine: StateMachine<S, E>, contestation: T) {
persister.persist(stateMachine, contestation)
}
fun create(): StateMachine<S, E> {
val stateMachine: StateMachine<S, E> = stateMachineFactory.getStateMachine()
stateMachine.start()
return stateMachine
}
}
Я нашел этот фрагмент кода в документации Spring и подумал, что его можно заменить на JpaRepository:
public void change(int order, String event) {
Order o = jdbcTemplate.queryForObject("select id, state from orders where id = ?", new Object[] { order },
new RowMapper<Order>() {
public Order mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Order(rs.getInt("id"), rs.getString("state"));
}
});
handler.handleEventWithState(MessageBuilder.withPayload(event).setHeader("order", order).build(), o.state);
}