【问题标题】:How to get exception thrown during state transition using spring state machine如何使用弹簧状态机在状态转换期间抛出异常
【发布时间】:2019-03-07 15:29:04
【问题描述】:

我试图了解,在状态转换期间操作引发的异常是如何发生的。我已经配置了这个简单的状态机:

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。那么,我怎样才能在我的服务中获取信息,指出出了什么问题,更重要的是什么?

感谢您的帮助。

最好的问候

【问题讨论】:

    标签: java spring spring-statemachine


    【解决方案1】:

    对于transitions exceptionsTransitionConfigurer 中可用的操作方法有一个重载

    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")
        }
    }
    

    【讨论】:

    • 我首先想到一定有另一种方式。但是,显然没有。所以,我使用你建议的方式,它正在工作。谢谢。
    • 我在我的项目的很多地方发送状态事件,所以我不想把控制权放在每个地方。有什么合适的方法吗?
    • 我不知道。您可以考虑利用转换到错误状态并管理那里的所有内容,但实际上取决于用例。
    • @SametBaskıcı 你可以有一个通用的方法来发送事件并检查扩展状态是否有错误,并在需要时抛出异常。这样,检查可以最小化为一个方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多