4

任何具有合理复杂性的状态机都需要在进入状态时执行一些进入动作。例如,UML 状态机图为此目的有一个特殊的操作。不幸的是,我看不到如何在 Akka FSM 中对此类进入操作(或退出操作)进行建模。对转换执行操作(使用下划线输出状态)不起作用,因为进入操作旨在更改状态数据(例如,准备在新状态下操作所需的数据结构)。关于如何在 Akka FSM 中模拟进入/退出动作的任何建议?

4

4 回答 4

1

如 Akka 的FSM 文档currentState -> currentState中所述, [调用后]将触发初始通知initialize

像这样的东西应该工作:

onTransition {
  case InitialState -> InitialState =>
    // Do stuff
}
于 2017-05-02T22:42:18.837 回答
0

我遇到了同样的问题,我玩了一段时间修改原始 FSM 特征以处理进入/退出。

https://github.com/jock71/jock-akka-fsm/blob/master/src/main/scala/jok/akka/fsm/FsmMod.scala

可以在以下位置找到使用示例:

https://github.com/jock71/jock-akka-fsm/blob/master/src/main/scala/jok/akka/fsm/TestAkkaFsm.scala

我不太清楚当在 goto using 和 entry handler 中指定时如何处理 StateData

于 2015-10-31T09:58:04.687 回答
0

Akka in Action一书也使用了UML 中的入口操作。他们使用带有通配符的转换实现进入操作,并使用外部事件来更改状态(但不是状态数据)。

github 上有一个完整的scala 示例。scala中的相关部分:

onTransition {
    case _ -> WaitForRequests => {
      if (!nextStateData.pendingRequests.isEmpty) {
        // go to next state
        self ! PendingRequests
      }
    }

或者翻译成java:

onTransition(
  matchState(null, WaitForRequests.class, () -> {
    if (!nextStateData().pendingRequests.isEmpty()) {
        // go to next state
        self().tell(PendingRequests, self());
        }
    }
  })
于 2017-03-14T10:08:51.143 回答
-1

如果你想为一个状态添加进入或退出动作,你需要在 onTransition 上写一些PartialFunction
例如,这是您在 AkkaFSM 中对进入或退出操作进行建模的方式:

onTransition {
   case _ -> StateA => /* This is an entry action for StateA. Do something here. You can send messages to actors (or self), so some state checks or setups. */
   case StateA -> _ => /* This is an exit action for StateA. Do something here. You can send messages to actors (or self), so some state post-checks or any cleanup task for the state */
}
于 2016-03-29T11:15:47.683 回答