Я начинаю использовать Spring Statemachine, и у меня возникают проблемы с управлением состоянием моих объектов.
Мой Statemachine имеет тип StateMachine.
Мой бизнес-объект Shipment имеет свойство enum (состояние) типа ShipmentState, которое должно содержать состояние конечного автомата эпизода. Вот мой требуемый рабочий процесс:
- Загрузка отправления из базы данных.
- Установите текущее состояние Statemachine из ShipmentState, который находится в этом экземпляре отправления.
- Отправьте событие в Statemachine.
- Получите результирующее состояние из Statemachine (событие после события) и установите ShipmentState в моем экземпляре Shipment.
- Сохраните экземпляр Shipment.
Проблема заключается в следующем: Как установить текущее состояние существующего StateMachine?
Мой текущий подход заключается в следующем: для каждого события создайте новый экземпляр StateMachine (с использованием StateMachineBuilder), указывающий начальное состояние в соответствии с экземпляром Отправления. Например:
@Service
public class StateMachineServiceImpl implements IStateMachineService {
@Autowired
private IShipmentService shipmentService;
@Override
public StateMachine<ShipmentState, ShipmentEvent> getShipmentStateMachine(Shipment aShipment) throws Exception {
Builder<ShipmentState, ShipmentEvent> builder = StateMachineBuilder.builder();
builder.configureStates().withStates()
.state(ShipmentState.S1)
.state(ShipmentState.S2)
.state(ShipmentState.S3)
.initial(shipmentService.getState())
.end(ShipmentState.S4);
builder.configureTransitions().withExternal().source(ShipmentState.S1).target(ShipmentState.S1)
.event(ShipmentEvent.S3).action(shipmentService.updateAction()).and().withExternal()
.source(ShipmentState.S1).target(ShipmentState.S2).event(ShipmentEvent.S3)
.action(shipmentService.finalizeAction()).and().withExternal().source(ShipmentState.S3)
.target(ShipmentEvent.S4).action(shipmentService.closeAction()).event(ShipmentEvent.S5);
return builder.build();
}
}
Что вы думаете о моем подходе?