Akka演员道具工厂

时间:2014-11-03 03:27:51

标签: akka actor

Akka和我相互认识。

来自:Akka 2.3.6 (current) Actor Recommended Practice

这是一个名为DemoActor的示例actor:

class DemoActor(magicNumber: Int) extends Actor {
  def receive = {
    case x: Int => sender() ! (x + magicNumber)
  }
}

在文档的推荐实践部分中,它指出:"最好在每个Actor的配对对象上提供工厂方法,以帮助保持合适的创建道具尽可能接近演员的定义。" 他们这样做:

object DemoActor {
  def props(magicNumber: Int): Props = Props(new DemoActor(magicNumber))
}

问题为道具方法指定工厂之间的区别如下:

object DemoActor {
  def props(magicNumber: Int): Props = Props(classOf[DemoActor], magicNumber)
}

如果你错过了它,差异就是Props构造函数的参数:

new DemoActor(magicNumber)

VS

classOf[DemoActor], magicNumber

Props section中的同一个akka文档页面中,它在使用Props(classOf[ActorWithArgs], "arg1"时也会提及: "在构造Props对象期间验证是否存在匹配的构造函数,如果找不到或找到多个匹配的构造函数,则会导致IllegalArgumentEception。"

那很好,不是吗?!?.... ....

1 个答案:

答案 0 :(得分:10)

  

那很好,不是吗?!?....

是的,但如果在编译期间可以捕获错误,那就更好了。直接调用构造函数的优点是编译器将捕获没有匹配构造函数的问题,而不是在运行时抛出异常。

关于Props apply方法的一个有趣的事情是,当你写:

Props(new DemoActor(magicNumber))

创建Props实例时,不会立即调用actor的构造函数。构造函数调用按名称​​传递,而不是按值传递。您可以在Props apply方法的签名中看到此内容:

def apply[T <: Actor](creator: ⇒ T)(implicit arg0: ClassTag[T]): Props

注意creator参数中的右箭头。这允许创建者构造被推迟,并且可能在远程演员的另一个过程中执行。

此处存在潜在危险,如果new操作在范围内关闭并捕获不打算序列化或不可序列化的值,从而使Props对象也不可序列化。这就是文档建议在actor的伴随对象中执行此操作的原因 - 以最小化关闭不打算序列化的数据的风​​险。