spring-state-machine拦截器

2023-11-28 13:25:23 浏览数 (2)

不乘人于利,不迫人于险。——刘向

继续分享spring-state-machine状态机的拦截器使用,这里需要留意一个细节:

如果一个事件没有被状态机接受(例如当前状态不是事件的source导致无法转换)

则不会进入拦截器进行处理(但监听器仍然工作,监听器的博客)

这里配置拦截器也很简单:

代码语言:javascript复制
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);
			}
		})

或者

代码语言:javascript复制
stateMachine.getStateMachineAccessor().withRegion()
                    .addStateMachineInterceptor(new StateMachineInterceptor());

同样,这里有非常多的方法在不同的时机执行:

代码语言:javascript复制
postStateChange
postTransition
preEvent
preStateChange
preTransition
stateMachineError

拦截器主要的特征是可以修改状态机、事件的行为,例如在 preEvent 方法中返回 null,则事件不会执行

0 人点赞