26. State Machine Error Handling

如果状态机在状态转换逻辑期间检测到内部错误,它可能会引发异常。 在内部处理此异常之前,用户有机会截取。

NormalMachineInterceptor可以用来拦截错误,并且它的例子如上所示。

StateMachine<String, String> stateMachine;

void addInterceptor() {
    stateMachine.getStateMachineAccessor()
        .doWithRegion(new StateMachineFunction<StateMachineAccess<String, String>>() {

        @Override
        public void apply(StateMachineAccess<String, String> function) {
            function.addStateMachineInterceptor(
                    new StateMachineInterceptorAdapter<String, String>() {
                @Override
                public Exception stateMachineError(StateMachine<String, String> stateMachine,
                        Exception exception) {
                    // return null indicating handled error
                    return exception;
                }
            });
        }
    });

}

当检测到错误时,执行正常事件通知机制。 这允许使用StateMachineListener或Spring应用程序上下文事件侦听器,更多关于这些阅读部分第21章,侦听状态机事件。

话虽如此,一个简单的听众会看起来像:

public class ErrorStateMachineListener
        extends StateMachineListenerAdapter<String, String> {

    @Override
    public void stateMachineError(StateMachine<String, String> stateMachine, Exception exception) {
        // do something with error
    }
}

检查StateMachineEvent的通用ApplicationListener看起来像。

public class GenericApplicationEventListener
        implements ApplicationListener<StateMachineEvent> {

    @Override
    public void onApplicationEvent(StateMachineEvent event) {
        if (event instanceof OnStateMachineError) {
            // do something with error
        }
    }
}

也可以直接定义ApplicationListener来仅识别StateMachineEvent实例。

public class ErrorApplicationEventListener
        implements ApplicationListener<OnStateMachineError> {

    @Override
    public void onApplicationEvent(OnStateMachineError event) {
        // do something with error
    }
}

为转换定义的动作也有其自己的错误处理逻辑,第11.7.2节“转换动作错误处理”。

results matching ""

    No results matching ""