同步执行状态动作

时间:2019-06-03 12:28:49

标签: spring multithreading spring-statemachine

我正在使用具有多个区域的弹簧状态机,并将某些区域配置为具有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 个答案:

答案 0 :(得分:1)

  

我想使用同步任务计划程序,但是我不认为   有这样的事情。

是的-Spring State Machine使用TaskExecutor来执行区域,默认情况下它是同步的。看起来您正在使用它-您可以在堆栈跟踪中看到它:

\x -> x :: Int -> Int
  

还有另一种方法来确保我的进入/退出操作在之后完成   过渡吗?

基本上没有-过渡会“包装”您要退出的状态的 exit 操作和您要进入的状态的 entry 操作。 / p> SM中的

动作是两种类型- state transition 动作。我假设您正在谈论状态进入/退出操作。 这是执行这些类型的动作的顺序顺序。

以下情形是同步执行的:

  • 两个状态org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) A
  • B进行状态进入和退出操作,对A进行状态进入和退出操作
  • B-> A过渡的过渡操作

SM处于状态B中-这意味着A上的状态输入操作已经执行。我们正在发送一个事件,该事件会触发从A-> A的过渡。

B

您可以通过向SM配置提供自定义SM侦听器来重现相同的结果。