Пружинное состояние машины задается кратным начальным состоянием
У меня серийный статус порядка, как
public enum orderStateEnum {
STATE_UNUSED("UNUSED"),
STATE_ORDERED("ORDERED"),
STATE_ASSIGNED("ASSIGNED"),
STATE_ASSIGN_EXCEPTION("ASSIGN_EXCEPTION"),
STATE_PACKED("PACKED"),
//and so on
}
и я хочу использовать spring.statemachine(или другую реализацию конечного автомата) для управления переходом, как из STATE_UNUSED to STATE_ORDERED STATE_ORDERED to STATE_ASSIGNED STATE_ORDERED to STATE_ASSIGN_EXCEPTION STATE_ASSIGNED to STATE_PACKED
однако все данные о заказах хранятся в базе данных, поэтому в моем случае, если у меня есть заказ с состоянием STATE_ASSIGNED, я получаю состояние заказа из базы данных, но в spring.statemachine я должен ``` StateMachine stateMachine = new StateMachine(); stateMachine.createEvent(Event_take_order);
когда я создаю новый экземпляр stateMachine, его начальное состояние - STATE_UNUSED, однако я хочу, чтобы начальное состояние было состоянием, которое я извлекаю из базы данных STATE_ASSIGNED, как я могу этого достичь? Я прочитал [ https://docs.spring.io/spring-statemachine/docs/1.0.0.BUILD-SNAPSHOT/reference/htmlsingle/] но не могу найти в этом никакого решения.
0 ответов
Когда вы создаете новый StateMachine, вы можете получить StateMachineAccessor, используя stateMachine.getStateMachineAccessor()
StateMachineAccessor - это:- Функциональный интерфейс для StateMachine, позволяющий программный доступ к базовым функциям. Функции с префиксом "doWith" будут предоставлять StateMachineAccess через StateMachineFunction для лучшего функционального доступа с помощью jdk7. Функции с префиксом "with" лучше подходят для лямбда-выражений.(Из Документов Java)
StateMachineAccessor имеет метод doWithAllRegions, в котором вы можете предоставить реализацию StateMachineFunction (интерфейс), а doWithAllRegions выполнит данную StateMachineFunction со всеми рекурсивными регионами.
Итак, для достижения того, что вы пытаетесь сделать, код будет выглядеть так:-
StateMachine<orderStateEnum, Events> stateMachine = smFactory.getStateMachine();
stateMachine.getStateMachineAccessor().doWithAllRegions(access -> access
.resetStateMachine(new DefaultStateMachineContext<>(STATE_ASSIGNED, null, null, null)));
Я предоставил реализацию интерфейсов с использованием лямбда-выражений.