我有一个工作流,其中一种状态应该进行状态轮询,所以基本上,每当我进入该状态时,我都想运行一个动作,然后每隔n秒钟执行一次操作,直到获得期望的状态响应。
以下是状态机配置,“开始”和“中间”状态以轮询方式运行(重新键入直到获得预期的响应)
StateMachineBuilder.Builder<StateMachineConfig.States, StateMachineConfig.Events> builder = StateMachineBuilder.builder();
builder.configureConfiguration()
.withConfiguration()
.machineId("Test-" + i)
.taskScheduler(scheduler);
builder.configureStates()
.withStates()
.initial(StateMachineConfig.States.START)
.state(StateMachineConfig.States.START)
.state(StateMachineConfig.States.INTERMEDIATE)
.state(StateMachineConfig.States.STOP)
.end(StateMachineConfig.States.STOP);
builder.configureTransitions()
.withExternal()
.source(StateMachineConfig.States.START)
.target(StateMachineConfig.States.START)
.action(startAction)
.timer(30000)
.and()
.withExternal()
.source(StateMachineConfig.States.START)
.target(StateMachineConfig.States.INTERMEDIATE)
.event(StateMachineConfig.Events.GO1)
.and()
.withExternal()
.source(StateMachineConfig.States.INTERMEDIATE)
.target(StateMachineConfig.States.INTERMEDIATE)
.timer(30000)
.action(intermediateAction)
.and()
.withExternal()
.source(StateMachineConfig.States.INTERMEDIATE)
.target(StateMachineConfig.States.STOP)
.event(StateMachineConfig.Events.GO2)
.and()
.withInternal()
.source(StateMachineConfig.States.STOP)
.action(stopAction);
StateMachine stateMachine = builder.build();
stateMachine.start();
这里的问题是,状态机启动startAction运行后,它将状态状态机的事件GO1发送到INTERMEDIATE,但是中间体操作并没有立即运行,而是等待了整整30秒,而startAction不这样做。
我认为,罪魁祸首是,这两个TimerTriggers都在状态机生命周期的初始阶段在doStart()中进行了调度,并且一旦进入START状态,就会处理这两个触发器。当我进入INTERMEDIATE状态时,我没有要处理的“第0次”计时器触发事件。这是预期的行为吗?如果是的话,我该如何实现这种功能?我想每隔n秒(包括“第0次”)执行一次操作
回购以重现该问题:https://github.com/shethchintan7/spring-state-machine-thread-leak