Spring 状态机状态动作与转换动作

Spring Statemachine State Actions vs Transition actions

Spring 状态机提供以下类型的操作。有人可以解释一下在哪种情况下应该使用哪种类型的操作吗?而且,如果操作失败,那么状态机是否会移动到下一个状态?

  1. 事件动作 - 生成事件时附加到转换的动作。
  2. 状态进入动作
  3. 状态退出动作
  4. 状态 DoAction

我的场景是,当状态机进入 S1 状态时,它需要执行一些操作,如果成功则只进入 S2。应该是状态动作还是事件动作?

S1--->S2

  1. 事件动作:这是最常见的情况,您有 StateA 并希望在收到 EventAB 时移动到 StateB。如果机器在 StateA 上并且您将 EventAB 提交给它,则将触发操作。可以(并且可选)提供错误操作以进行个人处理,以防常规操作抛出异常

  2. 状态进入动作:每次机器到达指定状态时都会触发动作。我见过人们用它来提供初始状态自定义行为

  3. 同上,但在每个状态退出时都会触发

  4. 我没用过这个,但根据文档(下面的片段),它类似于状态输入(如果你提供单一操作),但也可以使用错误操作.

关于此的更新:我在 UML 规范中读到状态 do 也可以用于您希望机器处于该状态时持续发生的动作

注意事项是动作可以附加到转换(即从 A 到 B,或从 B 到 A),因此 FROM 和 TO 很重要,而为特定状态配置的动作不关心它来自哪里, 但仅与状态 enter/exit

有关
//Specify a state S with state behaviour Action. Currently synonym for state(Object, Action).
StateConfigurer<S, E> stateDo(S state, Action<S, E> action);

如果 entry/transition 操作失败(并且您没有选择 pseudo-state),机器将保持相同状态(不会移动)。

对于你的场景,这取决于,S1 是初始状态吗?如果是这样,您可能需要采取州行动。否则,S1 -> S2 之间的过渡动​​作就可以了。