Я хочу использовать timerOnce для задержки, но это не работает - PullRequest
1 голос
/ 15 апреля 2019

Я хочу перейти из состояния REPEATED_EXPORT_TO_A в состояние EXPORT_TO_A_AGAIN с задержкой, но действие reexportEvent () не выполнено. У меня есть следующий конечный автомат:

    public StateMachineBuilder.Builder<StatusId, ActionId> construct(StateMachineBuilder.Builder<StatusId, ActionId> builder) throws Exception {
builder.configureStates().withStates()
        .states(ImmutableSet.of(OBTAINED_BY_B, FOR_EXPORT_TO_A, EXPORTING_TO_A,
                EXPORT_TO_A_ERROR, EXPORTING_TO_A_TIMEOUT,
                RECEIVED_BY_A, NOT_RECEIVED_BY_A, RECEIVED_A_ERROR, REPEATED_EXPORT_TO_A))
        .state(FOR_EXPORT_TO_A, checkPassedAction(), null)
        .state(EXPORTING_TO_A, exportedAction(), null)

        .choice(EXPORTED_TO_A_OR_NOT)
        .choice(EXPORT_TO_A_AGAIN);

builder.configureTransitions().withExternal()
        .source(OBTAINED_BY_B).target(FOR_EXPORT_TO_A)
        .and().withExternal()
        .source(FOR_EXPORT_TO_A).target(EXPORTED_TO_A_OR_NOT)

        .and().withChoice()
        .source(EXPORTED_TO_A_OR_NOT)
        .first(EXPORTING_TO_A, exportingToAGuardSsm)
        .last(REPEATED_EXPORT_TO_A)

        .and().withExternal()
        .source(REPEATED_EXPORT_TO_A)
        .target(EXPORT_TO_A_AGAIN)
        .event(REEXPORT_TO_A)

        .and().withChoice()
        .source(EXPORT_TO_A_AGAIN)
        .first(EXPORTING_TO_A, exportingToAGuardSsm)
        .then(EXPORT_TO_A_ERROR, checkRepeatExportGuard)
        .then(REPEATED_EXPORT_TO_A, repeatExportToBGuardSsm)
        .last(EXPORT_TO_A_ERROR)

Это внутренний переход для задержки

   .and().withInternal()
    .source(REPEATED_EXPORT_TO_A)
    .action(reexportEvent())
    .timerOnce(5000)

но это действие не выполнено

 private Action<StatusId, ActionId> reexportEvent() {
    //some code
      return context -> {
          Doc doc = SsmUtil.getDoc(context);
          doc.setRepeatCount(doc.getRepeatCount() + 1);
          context.getStateMachine().sendEvent(REEXPORT_TO_A);
      };
  }

1 Ответ

0 голосов
/ 16 апреля 2019

Для триггеров в Spring State Machine необходимо понять одну ключевую вещь - они связаны с состоянием, и вам нужно оставаться в этом состоянии, чтобы триггер выполнялся. Задержка начинается в тот момент, когда вы входите в состояние - если вы выходите из состояния до того, как время задержки достигнуто, триггер не выполняется.

Пример:

  • указать триггер для состояния "A" с 5-секундной задержкой

  • введите состояние "A"

  • на втором втором состоянии выхода "A"

Триггер не будет выполнен, поскольку вы вышли из состояния «A» до истечения установленного времени задержки.

Оформить юнит-тест (TestTriggersDelay), который демонстрирует это поведение здесь .

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