【问题标题】:Is it possible to compose FSMs in Akka?是否可以在 Akka 中编写 FSM?
【发布时间】:2013-11-10 10:31:48
【问题描述】:

对于普通演员,他们可以组成。但是,我似乎找不到任何关于使用 FSM 进行操作的信息。并且没有使用 += 来添加内容的接收块。有没有人有任何尝试泛化 FSM 的经验?

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

【问题讨论】:

  • 你试过继承吗?
  • 我尝试过继承,但出现了一些奇怪的用例。例如,我只能切换到超类定义的状态(从子类型),反之则不行。确实有它的用例,但它们很少。对于普通演员,您可以在超类型中定义所有接收块并使用 += 添加到它们以在每个子类型上创建自定义设置。但是对于 FSM,我不知道如何做类似的事情。 += 不起作用,我不知道它会是什么语法。现在我想了想,我可以尝试在超类型上使用 Type 参数。如果我弄清楚了,我会发布它。
  • 我也尝试过继承;试过了,例如重载override def onTransition(pf) = doSomething andThen super.onTransition(pf),但这些是最终方法,无法更改...

标签: scala akka fsm


【解决方案1】:

您可以使用部分函数来组合状态行为,方法与组合 Actor 部分函数的方式相同。 when() 函数需要 scala.PartialFunction[FSM.this.Event, FSM.this.State] 类型的部分函数。在下面的示例中,我使用 trait 中声明的部分函数(例如一些常见行为)扩展状态 Jibber。您可以使用完全相同的技术,使用声明为 scala.PartialFunction[StopEvent, Unit] 的 PF 从 trait 扩展 onTermination 行为。

我使用这种技术从一些复杂的 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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2015-08-31
    • 2017-03-13
    • 2020-06-20
    相关资源
    最近更新 更多