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节“转换动作错误处理”。