根据Akka FSM 文档 http://doc.akka.io/docs/akka/snapshot/scala/fsm.html:
笔记
可以使用 goto(S) 或stay() 实现相同状态转换(当前处于状态 S 时)。它们之间的区别在于 goto(S) 将发出一个可由 onTransition 处理的事件 S->S 事件,而stay() 则不会。
我通过扩展 FSM 创建了 actor。当我的 actor 处于状态数据 Data3 的“On”状态时,它会切换到状态数据 Data2 的状态“On”。我使用 Data2 来使用“goto(On)”。我预计将执行“onTransition On->On”方法,但事实并非如此。应该发出事件 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()
}