对于普通演员来说,他们可以组成。但是,我似乎找不到任何关于使用 FSM 进行操作的信息。并且没有使用 += 来添加内容的接收块。有没有人有任何尝试概括 FSM 的经验?
我无法提供代码示例,因为我还没有任何代码,因为我不知道我是否可以编写 FSM。
您可以使用部分函数来组合状态行为,方法与组合 Actor 部分函数的方式相同。该when()
函数需要 ) 类型的部分函数scala.PartialFunction[FSM.this.Event, FSM.this.State]
。在下面的示例中,我Jibber
使用在 trait 中声明的部分函数(例如一些常见行为)扩展状态。您可以使用完全相同的技术,onTermination
使用声明为 的 PF 从 trait 扩展行为scala.PartialFunction[StopEvent, Unit]
。
我使用这种技术从一些复杂的 FSM 中提升了重要的常见行为。
package monster
import akka.actor._
import monster.FlyingSpaghetti._
// State and data objects
object FlyingSpaghetti {
trait State
object Jibber extends State
object Jabber extends State
object Ping
object Done
}
// Trait with common behaviour behaviour
trait FlyingSpaghetti extends Actor with FSM[State,String]{
val layer: StateFunction = {
case Event(Done,s) ⇒
println("Done behaviour layered")
stop()
}
}
class Monster() extends FlyingSpaghetti {
startWith(Jibber,"jabber")
self ! Ping
println("Starting")
// First, do the common behaviour PF then do specialised behaviour
when(Jibber) (layer orElse {
case Event(Ping,"jabber") ⇒
println("jabber")
goto(Jabber) using "jibber"
case Event(Done,s) ⇒
println("Done jabbering")
stop()
})
when(Jabber) {
case Event(Ping,"jibber") ⇒
println("jibber")
goto(Jibber) using "jabber"
case Event(Done,s) ⇒
println("Done jibbering")
stop()
}
}
object Run extends App {
val system = ActorSystem("mySystem")
val rattle = system.actorOf(Props[Monster])
rattle ! Ping
rattle ! Ping
rattle ! Done
Thread.sleep(100)
system.shutdown()
}