Невозможно вызвать событие из действия - PullRequest
1 голос
/ 19 июня 2019

Я настраиваю транзакции конечного автомата весны, я хочу запустить Event2 по завершении Event1

Это состояния, которые у меня есть

Состояния -> "ПЕРВОНАЧАЛЬНО", "ВТОРОЕ", "ТРЕТЬЕ"

Я настроил транзакции для отправки SECOND_EVENT из действия FIRST_EVENT, как показано ниже

transitions.withExternal()
    .source("INITIAL")
    .target("SECOND")
    .event("FIRST_EVENT")
    .action(new Action<String, String>() {
        @Override
        public void execute(StateContext<String, String> context) {
            System.out.println("FIRST_ACTION_EXECUTED");
            context.getStateMachine().sendEvent("SECOND_EVENT");
        }
    })
    .and()
    .withExternal()
    .source("SECOND")
    .target("THIRD")
    .event("SECOND_EVENT")
    .action(new Action<String, String>() {
        @Override
        public void execute(StateContext<String, String> context) {
            System.out.println("TEST SUCCESS");
        }
    });

Здесь я получаю исключение evenNotAccepted, и я знаю, что причина в том, что statemachine.getState () имеет значение INITIAL и не может напрямую изменить состояние с INITIAL на THIRD.

Итак, мой вопрос: есть ли возможность настроить мой автомат состояний для автоматического запуска второго события при завершении первого события

1 Ответ

1 голос
/ 19 июня 2019

Это из-за типа действий, которые вы используете.Существует два основных типа действий в Spring SM - переход действия и состояние действия - и они разрешаются в разное время.Вы можете увидеть последовательность разрешения этих действий здесь .

Чтобы инициировать события, чтобы перейти к следующему состоянию, вы должны использовать действия состояния.

Вы можете настроить действия состояния следующим образом:

   builder.configureStates()
            .withStates()
            .initial(SI)
            .state(F1, context -> context.getStateMachine().sendEvent(E2))
            .state(F2, context -> context.getStateMachine().sendEvent(E3))
            .end(SF);

    builder.configureTransitions()
            .withExternal().source(SI).target(F1).event(E1)
            .and()
            .withExternal().source(F1).target(F2).event(E2)
            .and()
            .withExternal().source(F2).target(SF).event(E3)
                .action(context -> System.out.println("Completing SM!"));

Просто запускать событие E1 вручную, приведет к следующему выводу (события E2 и E3 запускаются автоматическичерез действия государства):

STATE ENTERED: SI
STAGE TRANSITIONS From: null To: SI
STATE EXITED: SI
STATE ENTERED: F1
STAGE TRANSITIONS From: SI To: F1
21:45:39.153 [pool-2-thread-1] DEBUG org.springframework.statemachine.support.AbstractStateMachine - Queue event GenericMessage [payload=E2, headers={id=393a5636-a760-57d6-a98b-d31eb75f048e, timestamp=1560969939152}] SF F2 F1 SI  / F1 / uuid=4e8773c1-e755-40de-b431-e53a4b0ca64d / id=null
STATE EXITED: F1
STATE ENTERED: F2
STAGE TRANSITIONS From: F1 To: F2
21:45:39.161 [pool-2-thread-1] DEBUG org.springframework.statemachine.support.AbstractStateMachine - Queue event GenericMessage [payload=E3, headers={id=f5899e8b-e4a5-e079-3a30-66114a7accac, timestamp=1560969939161}] SF F2 F1 SI  / F2 / uuid=4e8773c1-e755-40de-b431-e53a4b0ca64d / id=null
Completing SM!
STATE EXITED: F2
STATE ENTERED: SF
STAGE TRANSITIONS From: F2 To: SF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...