如何使用Spring State Machine在状态转换期间引发异常

时间:2019-03-07 15:29:05

标签: java spring spring-statemachine

我试图理解,状态转换期间动作可能引发异常。我已经配置了这个简单的状态机:

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 :(得分:0)

对于transitions exceptionsTransitionConfigurer

中的操作方法有一个重载。
assistant.Tasks.RemoveAll();

这意味着,如果在过渡期间引发异常,则可以指定和触发其他操作。可以从传递给操作的action(Action<S,E> action, Action<S,E> error) 中获得该异常。

触发错误操作后,可以使用以下方法检索异常:

StateContext

在错误操作中,您可以做一些事情来处理异常:

  • 记录异常和上下文
  • 转换为某些错误状态
  • 清除上下文并转换为相同状态,并尝试执行一些重试逻辑
  • 在上下文中添加一些其他信息,并将上下文返回给调用方

例如:

context.getException();

在服务(调用方)中,您可以根据需要处理异常,例如:

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