是否有可能在Akka组成FSM?

时间:2013-11-10 10:31:48

标签: scala akka fsm

对于常规演员,他们可以组成。但是,我似乎无法找到任何与FSM一起做的事情。并且没有使用+ =来添加内容的接收块。有没有人有尝试推广FSM的经验?

我无法提供代码示例,因为我还没有任何代码,因为我不知道我是否可以编写FSM。

1 个答案:

答案 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()
}