根据 Akka FSM docs :
Note Same-state transitions can be implemented (when currently in state S) using goto(S) or stay(). The difference between those being that goto(S) will emit an event S->S event that can be handled by onTransition, whereas stay() will not.
我通过扩展 FSM 创建了 actor。当我的 actor 处于状态数据 Data3 的“On”状态时,它会切换到状态数据 Data2 的“On”状态。我使用“使用 Data2 的 goto(On)”。我预计将执行方法“onTransition On->On”,但事实并非如此。应该发出 Event On->On。 这是我运行此 actor 时的输出:
Off, event Message! with state Data1
onTransition: Off->On Data3
On, timeout with Data3
On, timeout with Data2
On, timeout with Data1
onTransition: On ->Off Data1
知道我做错了什么吗?
这是来源:
import akka.actor.FSM
import scala.concurrent.duration._
trait State
case object On extends State
case object Off extends State
sealed trait Data
case object Data1 extends Data
case object Data2 extends Data
case object Data3 extends Data
class SomeFsm extends FSM[State,Data] {
startWith(Off,Data1)
when(On,stateTimeout = 1 second) {
case Event(StateTimeout,Data3) => println("On, timeout with Data3");goto(On) using Data2
case Event(StateTimeout,Data2) => println("On, timeout with Data2");goto(On) using Data1
case Event(StateTimeout,Data1) => println("On, timeout with Data1");goto(Off) using Data1
}
when(Off){
case Event(m,s) => println(s"Off, event $m with state $s");goto(On) using Data3
}
whenUnhandled{
case Event(e, s) =>
log.warning("received unhandled request {} in state {}/{}", e, stateName, s)
stay()
}
onTransition{
case On -> On =>
print("onTransition: ")
nextStateData match {
case Data3=> println("On ->On (Data3")
case Data2=> println("On ->On (Data2")
case Data1=> println("On ->On (Data1")
}
case On-> Off => println(s"onTransition: On ->Off $nextStateData")
case Off-> On => println(s"onTransition: Off->On $nextStateData")
}
initialize()
}
最佳答案
这issue已报告并将在 version 2.4 中修复
关于scala - 转到相同状态后,FSM actor 未触发 onTransition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27356655/