与Akka FSM的进入行动

与Akka FSM的进入行动,akka,fsm,akka-fsm,Akka,Fsm,Akka Fsm,任何具有合理复杂性的状态机都需要在进入状态时执行一些进入操作。例如,UML状态机图有一个特殊的动作用于此目的。不幸的是,我不知道如何在Akka FSM中建模这样的进入动作(或退出动作)。对转换执行操作(使用下划线传出状态)不起作用,因为输入操作旨在更改状态数据(例如,准备在新状态下操作所需的数据结构)。关于如何在Akka FSM中模拟出入境行动,有何建议 我也有同样的问题,我在修改最初的FSM特征以处理进入/退出时玩了一段时间 有关使用示例,请访问: 我不太清楚如何处理在goto using

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

我也有同样的问题,我在修改最初的FSM特征以处理进入/退出时玩了一段时间

有关使用示例,请访问:


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

如果要为状态添加进入或退出操作,需要在onTransition上使用write some 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 */
}
这本书还使用了。它们使用带有通配符的转换实现输入操作,并使用外部事件更改状态(但不更改状态数据)

这是一个完整的过程。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());
        }
    }
  })
如Akka中所述,初始
currentState->currentState
通知将[在调用
initialize
]后]触发

像这样的方法应该会奏效:

onTransition {
  case InitialState -> InitialState =>
    // Do stuff
}

所谓进入/退出操作,您是指在参与者启动之前或参与者停止之后执行的操作?还是说对状态转换有副作用?我认为你的问题不够清楚。状态机术语中的进入动作是进入状态时执行的函数。与演员停止/启动生命周期无关。我明白了。为什么不使用
goto(NewState)。使用(newData)
语法更改状态数据?该问题明确与此选项相关,并解释了为什么它不足够-无法更改状态数据。我想我误解了您的问题,因为我认为您只是想对状态本身或actor中的某个局部变量执行检查或操作,而不是对数据本身。我会留下答案,即使答案是错的,因为它回答了我在标题中提到的问题。