Выполнить действия состояния синхронно - PullRequest
0 голосов
/ 03 июня 2019

Я использую конечный автомат пружин с несколькими регионами, и я настраиваю некоторый регион, чтобы иметь entryAction и exitAction.

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

Вот трассировка стека, когда запланированы действия:

    at org.springframework.statemachine.state.AbstractState.entry(AbstractState.java:208)
    at org.springframework.statemachine.state.ObjectState.entry(ObjectState.java:156)
    at org.springframework.statemachine.support.AbstractStateMachine.entryToState(AbstractStateMachine.java:1216)
    at org.springframework.statemachine.support.AbstractStateMachine.entryToState(AbstractStateMachine.java:1161)
    at org.springframework.statemachine.support.AbstractStateMachine.setCurrentStateInternal(AbstractStateMachine.java:971)
    at org.springframework.statemachine.support.AbstractStateMachine.setCurrentState(AbstractStateMachine.java:949)
    at org.springframework.statemachine.support.AbstractStateMachine.setCurrentState(AbstractStateMachine.java:944)
    at org.springframework.statemachine.support.AbstractStateMachine.setCurrentStateInternal(AbstractStateMachine.java:1038)
    at org.springframework.statemachine.support.AbstractStateMachine.setCurrentState(AbstractStateMachine.java:949)
    at org.springframework.statemachine.support.AbstractStateMachine.switchToState(AbstractStateMachine.java:841)
    at org.springframework.statemachine.support.AbstractStateMachine.access$400(AbstractStateMachine.java:77)
    at org.springframework.statemachine.support.AbstractStateMachine$2.transit(AbstractStateMachine.java:301)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.handleTriggerTrans(DefaultStateMachineExecutor.java:248)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.processTriggerQueue(DefaultStateMachineExecutor.java:395)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.access$100(DefaultStateMachineExecutor.java:61)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor$1.run(DefaultStateMachineExecutor.java:281)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.scheduleEventQueueProcessing(DefaultStateMachineExecutor.java:300)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.execute(DefaultStateMachineExecutor.java:144)
    at org.springframework.statemachine.support.AbstractStateMachine.sendEventInternal(AbstractStateMachine.java:559)
    at org.springframework.statemachine.support.AbstractStateMachine.sendEvent(AbstractStateMachine.java:211)

Чтобы избежать условий гонки и убедиться, что состояние входа / выходаДействия завершены после выполнения функции sendEvent, я хотел бы использовать Синхронный планировщик задач, но я не думаю, что есть такая вещь (мне пришлось бы реализовать свою собственную).Или есть другой способ убедиться, что мои действия входа / выхода выполнены после перехода?

1 Ответ

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

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

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

org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)

Есть ли другой способ убедиться, что мои действия входа / выхода выполнены после перехода?

По сути, нет - переход "оборачивает" действие exit состояния, из которого вы выходите, и действие entry состояния, в которое вы входите.

Действия в СМ бывают двух типов - состояние или переход действия.Я предполагаю, что вы говорите о состоянии входа / выхода.Вот порядок последовательности, в которой выполняются эти типы действий.

Приведенный ниже сценарий выполняется синхронно:

  • два состояния A и B
  • действие входа и выхода из состояния на A, состояние входа идействие выхода на B
  • действие перехода на A -> B переход

SM находится в состоянии A - это означает, что вход в состояниедействие на A уже выполнено.Мы отправляем событие, которое инициирует переход от A -> B.

Transition started: from: A to: B
Action on transition from A to B //when transition starts, the transition action kicks in, before exiting state A
State A exit action on state //before exiting state A, the state A exit action kicks in  
State exited: A
State entered: B
State B entry action on state
Transition ended: from: A to: B

Вы можете воспроизвести те же результаты, предоставив настраиваемый SM-прослушиватель для конфигурации SM.

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