计时器行为不明确

时间:2018-12-12 11:13:31

标签: spring spring-statemachine

我有一个工作流,其中一种状态应该进行状态轮询,所以基本上,每当我进入该状态时,我都想运行一个动作,然后每隔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

0 个答案:

没有答案