Art*_*hur 1 spring multithreading spring-statemachine
我正在使用具有多个区域的 Spring 状态机,并且我将某些区域配置为具有 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)
Run Code Online (Sandbox Code Playgroud)
为了避免竞争条件并确保功能完成后状态进入/退出操作完成sendEvent,我想使用同步任务调度程序,但我不认为有这样的事情(我必须实现我自己的) )。或者是否有其他方法可以确保我的进入/退出操作在转换后完成?
我想使用同步任务调度程序,但我不认为有这样的东西。
是的,有 - Spring 状态机使用 TaskExecutor 进行区域执行,并且默认情况下它是同步的。看起来您正在使用它 - 您可以在堆栈跟踪中看到它:
org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
Run Code Online (Sandbox Code Playgroud)
是否有其他方法可以确保我的进入/退出操作在转换后完成?
基本上没有 - 转换“包装”了您要退出的状态的退出操作和您要进入的状态的进入操作。
SM 中的动作有两种类型:状态动作或转换动作。我假设您正在谈论状态进入/退出操作。以下是执行这些类型的操作的顺序。
以下场景是同步执行的:
A和BA, 状态进入和退出动作 onBA->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
Run Code Online (Sandbox Code Playgroud)
您可以通过向 SM 配置提供自定义 SM 侦听器来重现相同的结果。
| 归档时间: |
|
| 查看次数: |
2654 次 |
| 最近记录: |