对于常规演员,他们可以组成。但是,我似乎无法找到任何与FSM一起做的事情。并且没有使用+ =来添加内容的接收块。有没有人有尝试推广FSM的经验?
我无法提供代码示例,因为我还没有任何代码,因为我不知道我是否可以编写FSM。
答案 0 :(得分:2)
您可以使用部分函数组合状态行为,方法与构成Actor部分函数的方式相同。 when()
函数需要类型为scala.PartialFunction[FSM.this.Event, FSM.this.State]
的部分函数。在下面的示例中,我使用在特征中声明的部分函数(例如,一些常见行为)扩展状态Jibber
。您可以使用完全相同的技术,使用声明为onTermination
的PF来扩展特征的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()
}