2016-07-10 37 views
1

我想表达如何正确使用Props。我的第一个想法是Props对象包含正在创建的actor的一些属性。这些属性可能包括参与者的字段值以及一些与部署相关的信息(例如,要使用调度器的e.e.g)。后者与实际的演员无关,因此应该独立运送。理解道具为演员创作

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

另外,一个小的,完全主观的建议:如果你刚刚开始使用Akka,从未做过Scala并决定使用Java,这样你就不必学习新的语言和新的框架。那么这就是我开始的,现在很遗憾。虽然这完全合乎逻辑,但似乎有更多资源(官方文档除外)针对Scala。在没有Scala案例类的情况下制作不可变的消息类很快就会变成Java中的* pain *等等。如果有疑问,请尝试将Scala仅限于actor和消息类,并在Java中执行其他所有操作。只是我的观点。 –

回答

1

我相信静态工厂方法对于Java来说可能特别有用,而Java往往会与Akka相当冗长。虽然您显示的代码是用于Actor类的,但您通常也会使用一些Inversion-of-Control风格配置引导程序类您通常会设置actor系统,然后是ActorSystem#actorOf类的actor。

现在,从演员的props工厂方法检索基Props实例后,你可以配置它有点个人用途(Props是不变的,但有返回修改实例的方法)。如果你需要一个不同的调度员,那么你将只需要修改你的引导程序类从这样的事情:

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

到:

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

(这些只是很小的代码片段,但我认为你的想法)