在akka Actors中堆叠多个特征

时间:2013-08-27 14:52:44

标签: scala akka actor traits

我正在创建扩展Actor的多个特征。然后我想创建一个使用其中一些特征的actor类。但是,我不确定如何在Actor类的receive方法中组合所有traits的receive方法。

特质:

 trait ServerLocatorTrait extends Actor {
    def receive() = {
      case "s" => println("I'm server ")
    }
  }

  trait ServiceRegistrationTrait extends Actor {
    def receive() = {
      case "r" => println("I'm registration ")
    }
  }

演员:

class FinalActor extends Actor with ServiceRegistrationTrait with ServerLocatorTrait {
  override def receive = {
     super.receive orElse ??? <--- what to put here
  }
}

现在,如果我将"r""s"发送到FinalActor,则只会在ServerLocatorTrait中发送 - 这是最后添加的特征。 所以现在它的工作方式是它认为超级最后添加的特性,所以在这种情况下ServerLocatorTrait

问题
如何组合FinalActor中所有特征的接收方法?

PS - 我见过react示例的演员:http://www.kotancode.com/2011/07/19/traits-multiple-inheritance-and-actors-in-scala/ 但这不是我需要的东西

1 个答案:

答案 0 :(得分:17)

我不确定你是否可以结合接收方法,因为这将涉及调用super的super以获取ServiceRegistration的{​​{1}}方法。这也很混乱。

另一种方法是为特征中的receive方法指定不同的名称。

receive

您仍然可以使用初始方法,但必须为每个混合特征链接trait ServerLocatorTrait extends Actor { def handleLocation: Receive = { case "s" => println("I'm server ") } } trait ServiceRegistrationTrait extends Actor { def handleRegistration: Receive = { case "r" => println("I'm registration ") } } class FinalActor extends Actor with ServiceRegistrationTrait with ServerLocatorTrait { def receive = handleLocation orElse handleRegistration } object Main extends App { val sys = ActorSystem() val actor = sys.actorOf(Props(new FinalActor)) actor ! "s" actor ! "r" sys.shutdown() }

super.receive

后一种解决方案对我来说非常难看。

请参阅以下链接,了解有关该主题的更详细讨论:

  

Extending Actors using PartialFunction chaining