Установить текущее состояние Spring StateMachine - PullRequest
0 голосов
/ 18 февраля 2020

Я начинаю использовать 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();
    }

}

Что вы думаете о моем подходе?

1 Ответ

0 голосов
/ 25 февраля 2020

Нет проблем с подходом. Вы можете сбросить конечный автомат до определенного состояния, используя приведенный ниже код.

stateMachine.getStateMachineAccessor().doWithAllRegions(access -> access
          .resetStateMachine(new DefaultStateMachineContext<>(state, null, null,null)));

Вы можете передать аргументы в DefaultStateMachineContext в соответствии с вашим вариантом использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...