了解演员创作的道具

时间:2016-07-10 14:17:15

标签: java scala akka

我正在努力强调如何正确使用Props。我的第一个想法是Props个对象包含正在创建的actor的一些属性。这些属性可能包括actor的字段值以及一些与部署相关的信息(例如,要使用的调度程序)。后者与实际的演员无关,因此应该独立发货。

但在the documentation中说好的做法是在演员中使用静态工厂方法(删除文档):

public class DemoActor extends UntypedActor {

  public static Props props(final int magicNumber) {
    return Props.create(new Creator<DemoActor>() {
      private static final long serialVersionUID = 1L;

      @Override
      public DemoActor create() throws Exception {
        return new DemoActor(magicNumber);
      }
    });
  }
}

我认为如果我们现在想要使用一个调度程序,这并不是很好,并且需求将在未来某个时候发生变化。它将导致修改Actor类(在我看来)是不正确的。

1 个答案:

答案 0 :(得分:1)

我认为,静态工厂方法对于Java来说可能特别有用,而这种方法对于Akka来说往往非常冗长。虽然您显示的代码是针对Actor类的,但您通常还会有一些Inversion-of-Control样式配置 bootstrapper 类,您通常会在其中设置演员系统,然后是ActorSystem#actorOf类的演员。

现在,在从Actor Props工厂方法中检索基本props实例后,您可以根据自己的需要对其进行一些配置(Props是不可变的但是返回方法修改过的实例)。如果你需要一个不同的调度程序,那么你只需要修改你的bootstrapper类:

ActorSystem system = ...;
system.actorOf(DemoActor.props(42), "demo-with-default-dispatcher");

为:

system.actorOf(DemoActor.props(42).withDispatcher("DemoDispatcher"), "demo-with-configured-dispatcher");

(这些只是最小的代码片段,但我认为你明白了这一点)