我正在使用具有多个区域的弹簧状态机,并将某些区域配置为具有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
函数后状态进入/退出动作已完成,我想使用同步任务调度程序,但我不认为有这种事情(我必须自己实现)。还是有其他方法可以确保在过渡后完成我的进入/退出操作?
答案 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侦听器来重现相同的结果。