Как получить исключение при переходе между состояниями с помощью пружинного автомата - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь понять, как возможно исключение, вызванное действием во время изменения состояния. Я настроил этот простой конечный автомат:

transitions
    .withExternal()
    .source(State.A1)
    .target(State.A2)
    .event(Event.E1)
    .action(executeAnActionThrowingAnException())

В своем классе обслуживания я ввел свой конечный автомат и отправил это событие E1:

@Service
public class MyService() {

    @Autowired
    private StateMachine<State, Event> stateMachine;

    public void executeMyLogic() {
        stateMachine.start()
        stateMachine.sendEvent(Event.E1);
        // how to get thrown exception here
    }
}

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

stateMachine.hasStateMachineError()

вернет false. Итак, как я могу получить информацию в моем сервисе, что что-то пошло не так и, что важнее, что?

Я ценю вашу помощь.

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 08 марта 2019

Для исключений переходов , есть перегрузка для метода действий, доступного в TransitionConfigurer

action(Action<S,E> action, Action<S,E> error)

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

Когда ваше действие по ошибке запускается, вы можете получить исключение с помощью:

context.getException();

Внутри действия по ошибке, которое вы можете выполнитьпара вещей для обработки исключения:

  • ведение журнала исключения и контекст
  • переход в какое-либо состояние ошибки
  • очистка контекста и переход кто же самое состояние и попытайтесь выполнить некоторую логику повторных попыток
  • добавить дополнительную информацию в контекст и вернуть контекст вызывающей стороне

Например:

context.getVariables().put("hasError", true); 
context.getVariables().put("error", ex);

А в вашем сервисе (звонящем) вы обрабатываете исключение так, как вам нравится, например:

public void executeMyLogic() {
    stateMachine.start()
    stateMachine.sendEvent(Event.E1);
    if (stateMachine.getExtendedState().getVariables().containsKey("hasError") {
      throw (RuntimeException)stateMachine.getExtendedState().getVariables().get("error")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...