我正在努力强调如何正确使用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类(在我看来)是不正确的。
答案 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");
(这些只是最小的代码片段,但我认为你明白了这一点)