
[英]what is the difference between AbstractActor, UntypedActor and AbstractBehavior in akka?
[英]Solution for “UntypedActor” deprecated in Akka (Java) Tutorial
Akka教程包含以下代码: http : //doc.akka.io/docs/akka/2.0.2/intro/getting-started-first-java.html
public void calculate (final int nrOfWorkers, final int nrOfElements, final int nrOfMessages){
ActorSystem system = ActorSystem.create("PiSystem");
final ActorRef listener = system.actorOf(Props.create(Listener.class), "listener");
ActorRef master = system.actorOf(new Props(new UntypedActorFactory() {
public UntypedActor create() {
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
}
}), "master");
master.tell(new Calculate(), ActorRef.noSender());
}
其中,不推荐使用UntypedActorFactory
。
所以我尝试使用Props.create
等
ActorRef master = system.actorOf( Props.create(
new Creator<Master>(){
public Master create(){
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
}
}), "master");
并且有例外说
不能使用非静态本地Creator来创建actor; 使它静态或顶级
所以我开始写一个静态类,它需要传递参数。
static class LocalCreator implements Creator<Master>{
public Master create(){
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
}
}
如何优雅地将参数nrOfWorkers等传递给create()
函数?
如果您阅读了Akka文档(Java风格),它列出了两种构造具有构造函数参数的actor的方法。 第一个是这样的(使用您的示例类):
ActorSystem system = ActorSystem.create("PiSystem");
final ActorRef listener = system.actorOf(Props.create(Listener.class), "listener");
ActorRef master = system.actorOf(Props.create(Master.class, nrOfWorkers, nrOfMessages, nrOfElements, listener), "master");
master.tell(new Calculate(), ActorRef.noSender());
或者如果你不想走那条路,你可以使用像这样的Creator
:
public class MasterCreator implements Creator<Master>{
private int nrOfWorkers, nrOfMessages, nrOfElements;
private ActorRef listener;
public MasterCreator(int nrOfWorkers, int nrOfMessages, int nrOfElements, ActorRef listener){
this.listener = listener;
this.nrOfElements = nrOfElements;
this.nrOfMessages = nrOfMessages;
this.nrOfWorkers = nrOfWorkers;
}
public Master create(){
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
}
}
然后像这样使用它:
ActorSystem system = ActorSystem.create("PiSystem");
final ActorRef listener = system.actorOf(Props.create(Listener.class), "listener");
ActorRef master = system.actorOf(Props.create(new MasterCreator(nrOfWorkers, nrOfMessages, nrOfElements, listener)), "master");
master.tell(new Calculate(), ActorRef.noSender());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.