阿超
>
spring-state-machine拦截器
不乘人于利,不迫人于险。——刘向
继续分享spring-state-machine
状态机的拦截器使用,这里需要留意一个细节:
如果一个事件没有被状态机接受(例如当前状态不是事件的source
导致无法转换)
则不会进入拦截器进行处理(但监听器仍然工作,监听器的博客)
这里配置拦截器也很简单:
1 2 3 4 5 6 7 8 9 10 11
| machine.addStateMachineInterceptor(new StateMachineInterceptorAdapter<TestStates,TestEvents>() { @Override public void postStateChange(State<TestStates, TestEvents> state, Message<TestEvents> message, Transition<TestStates, TestEvents> transition, StateMachine<TestStates, TestEvents> stateMachine, StateMachine<TestStates, TestEvents> rootStateMachine) { if (state.getId() == TestStates.S4) { nullCheck.set(transition == null); } super.postStateChange(state, message, transition, stateMachine, rootStateMachine); } })
|
或者
1 2
| stateMachine.getStateMachineAccessor().withRegion() .addStateMachineInterceptor(new StateMachineInterceptor());
|
同样,这里有非常多的方法在不同的时机执行:
1 2 3 4 5 6
| postStateChange postTransition preEvent preStateChange preTransition stateMachineError
|
拦截器主要的特征是可以修改状态机、事件的行为,例如在 preEvent
方法中返回 null
,则事件不会执行