24. State Machine Interceptor
除了使用StateMachineListener接口,另一种选择是使用StateMachineInterceptor。 一个概念上的区别是拦截器可以用来拦截和停止当前的状态变化或转换逻辑。 可以使用适配器类StateMachineInterceptorAdapter来替代默认的非操作方法,而不是实现完整的接口。
有一个配方第35章,坚持和一个样本第42章,坚持这些与使用拦截器有关
拦截器可以通过StateMachineAccessor注册。 拦截器的概念是相对较深的内部特征,因此不会通过StateMachine接口直接暴露。
stateMachine.getStateMachineAccessor()
.withRegion().addStateMachineInterceptor(new StateMachineInterceptor<String, String>() {
@Override
public Message<String> preEvent(Message<String> message, StateMachine<String, String> stateMachine) {
return message;
}
@Override
public StateContext<String, String> preTransition(StateContext<String, String> stateContext) {
return stateContext;
}
@Override
public void preStateChange(State<String, String> state, Message<String> message,
Transition<String, String> transition, StateMachine<String, String> stateMachine) {
}
@Override
public StateContext<String, String> postTransition(StateContext<String, String> stateContext) {
return stateContext;
}
@Override
public void postStateChange(State<String, String> state, Message<String> message,
Transition<String, String> transition, StateMachine<String, String> stateMachine) {
}
@Override
public Exception stateMachineError(StateMachine<String, String> stateMachine,
Exception exception) {
return exception;
}
});
有关上述示例中显示的错误处理的更多信息,请参见第26章,状态机错误处理。