Как повторить неудачное действие? - PullRequest
1 голос
/ 24 апреля 2019

Я просмотрел документацию Spring Statemachine, но не нашел четких ответов для некоторых сценариев.Я буду очень признателен, если кто-нибудь сможет прояснить мои вопросы.

Сценарий 1: Как повторить ошибки, связанные с ошибками действий?Допустим, у меня есть следующие состояния S1, S2 и S3, и когда мы переходим от S1 к S2, я хочу выполнить действие A2.Если действие A2 завершается неудачно, я хочу повторить попытку через определенные промежутки времени.Возможно ли это с помощью Spring StateMachine?

Рассмотрим, например, шаговые функции конечного автомата AWS.Вся работа в шаге функций состояний выполняется с помощью Task.И Задача может быть настроена для повторной попытки.

transitions
            .withExternal()
                .source(States.S1)
                .target(States.S2)
                .event(Events.E1)
                .action(action());

Сценарий 2: допустим, что Statemachine имеет состояния S1, S2 и S3.Текущее состояние S2.Если при запуске сервер отключается, выполнение Statemachine будет продолжено с того места, где он остановился, или нам придется делать это заново?

Сценарий 3: Когда Guard возвращает false (возможно, из-за ошибки)и предотвращает переход, что происходит дальше?

1 Ответ

0 голосов
/ 24 апреля 2019

Как повторить неудачное действие?

В Spring State Machine есть два типа действий - действия перехода и действия состояния.В сценарии 1 вы говорите о переходном действии.

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

.withExternal()
    .source(States.S1)
    .target(States.S2)
    .event(Events.E1)
    .action(action(), errorAction());

В вашем методе errorAction() вы можете реализовать свою логику.Возможные варианты:

  • переход в более раннее состояние и переход по тому же пути
  • переход в определенное состояние (например, состояние повтора), где вы можете использовать логику повторения (например, Task /Исполнитель, который повторяет действие N раз и осуществляет переход в другие состояния (например, действие успешно => перейти в нормальный режим; действие не выполнено после N попыток => переход в состояние терминала сбоя)

Также есть пример официальных задач , демонстрирующий логику восстановления / повторной попытки ( исходный код ).

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