处理Spring状态机

时间:2016-07-01 09:26:06

标签: spring-statemachine

我正在使用状态机构建器在我的应用程序中构建状态机。 该应用程序还有Action类,它们实现了org.springframework.statemachine.action.Action。 这些Action类用于执行每个阶段的入口操作。 如果从这些Action类中抛出任何异常,即从execute(StateContext paramStateContext)方法抛出,我想捕获该异常并发送一个事件(Terminated)并在更新带有错误详细信息的db之后将状态机驱动到End状态。 我试图通过覆盖stateMachineError(StateMachine stateMachine,Exception e)方法来使用状态机监听器。但不幸的是,这不起作用。  在我使用try catch将Action代码中的整个代码包装起来之前,以及在catch块中发送Terminated事件以便状态机将导航End状态之前,任何其他Spring状态机组件来捕获异常。 这是Iam使用的构建器。

Builder<String, String> builder = StateMachineBuilder
                .<String, String> builder();
        builder.configureConfiguration()
        .withConfiguration()
        .autoStartup(false)
        .listener(listener())
                .beanFactory(
                this.applicationContext.getAutowireCapableBeanFactory());
private StateMachineListener<String, String> listener() {
        return new StateMachineListenerAdapter<String, String>() {
            @Override
            public void stateChanged(
                    org.springframework.statemachine.state.State<String, String> from,
                    org.springframework.statemachine.state.State<String, String> to) {
                LOGGER.debug("State change to " + to.getId());
            }

            @Override
            public void stateMachineError(
                    StateMachine<String, String> stateMachine, Exception e) {
                e.printStackTrace();
                LOGGER.debug("Ah... I am not getting executed when exception occurs from entry actions");
                LOGGER.debug("Error occured from  " + stateMachine.getState()
                        + "and the error is" + e.toString());
            }
        };
    }

我使用了弹簧状态机核心的1.1.0.RELEASE版本

1 个答案:

答案 0 :(得分:0)

你是对的,stateMachineError或用@onStateMachineError注释的方法都不会在错误上执行。这在版本1.2中得到解决,该版本目前处于里程碑1。他们介绍了使用状态机上下文执行的errorAction

  

用户总是可以手动捕获异常,但是为转换定义了操作,可以定义在引发异常时调用的错误操作。然后可以从传递给该操作的StateContext获得异常。

所需的只是在状态机配置类中定义转换时指定错误操作以及所需的操作。来自example in the documentation

public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
        throws Exception {
    transitions
        .withExternal()
            .source(States.S1)
            .target(States.S2)
            .event(Events.E1)
            .action(action(), errorAction());
}

可以在Spring Statemachine issue #240中找到对此的详细讨论。