У меня есть рабочий процесс, в котором один из штатов должен проводить опрос статуса, поэтому, в основном, всякий раз, когда я приземляюсь в этом состоянии, я хочу запустить действие, а затем делать то же самое каждые 'n' секунд, пока не получу ожидаемыйответ.
Ниже приведена конфигурация конечного автомата, состояния START и INTERMEDIATE выполняются в режиме опроса (повторное выполнение до получения ожидаемого ответа)
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.И когда я попадаю в промежуточное состояние, у меня нет события запуска таймера «0-й раз» для обработки.Это предполагаемое поведение?Если да, как мне добиться такого рода функциональности, когда я хочу запускать действие каждые 'n' секунд, включая '0-й раз'
Репо, чтобы воспроизвести проблему: https://github.com/shethchintan7/spring-state-machine-thread-leak