【发布时间】:2016-09-02 19:53:18
【问题描述】:
我正在尝试理解 akka FSM 模式,在下面的示例中,我不明白为什么我没有得到对应于处理的打印 -> 完成。我的印刷品清楚地表明我已经完成了。有人可以启发我吗?
import akka.actor.{ActorRef, FSM}
import scala.concurrent.duration._
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.FSM.Event
import akka.actor.Props
object FSM2 extends App{
val system = ActorSystem("test")
val test = system.actorOf(Props[Test], "t")
test ! Set("hello")
}
sealed trait State
case object idle extends State
case object processing extends State
case object complete extends State
sealed trait Data
case class Content(processing:Int) extends Data
class Test extends FSM[State, Data]{
when(idle) {
case Event(test:Set[String], _) => {
goto(processing) using Content(test.size-1)
}
}
when(processing, stateTimeout = 1 second) {
case Event(StateTimeout, Content(count)) => {
println(count)
count match {
case 0 => goto(complete) using Content(0)
case _ => stay using Content(count)
}
}
}
when (complete, stateTimeout = 1 second) {
case Event(StateTimeout, _) => {
println("in complete")
goto(idle) using Content(0)
}
}
onTransition({
case idle -> processing => {
println("idle -> processing")
}
case processing -> complete => {
println("processing -> complete")
}
})
startWith(idle, Content(0))
initialize()
}
output:
idle -> processing
idle -> processing
0
idle -> processing
in complete
idle -> processing
I thought this would be the expected output:
idle -> processing
0
idle -> processing
processing -> complete
in complete
(go back to idle with no print)
我写的一些其他代码表明它不执行模式匹配,而是执行赋值。
如果我在状态对象(空闲、处理、完成和空闲 -> 处理等)上使用大写字母,它会起作用。
【问题讨论】: