Неоднозначное поведение таймера - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть рабочий процесс, в котором один из штатов должен проводить опрос статуса, поэтому, в основном, всякий раз, когда я приземляюсь в этом состоянии, я хочу запустить действие, а затем делать то же самое каждые '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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...