我对Akka很新,我有一个(希望)简单的问题。我有一个需要反复做一个小子任务的演员 - 也就是说,每次这个演员收到一条消息时,它都必须做N个子任务。这个子任务是我为儿童演员指定的。我的问题是,我应该为每个子任务创建一个子actor的新实例吗?或者我应该简单地产生一个儿童演员,并发送N消息?在这种情况下,最佳做法是什么?
为了更好地说明我的问题,这里有两个愚蠢的例子(在Java中 - 但希望对Scala家伙来说足够简单!):
第一个actor类在构造时创建一个子actor,然后向该单个子actor发送许多消息。
public class ParentActor extends UntypedActor {
private final ActorRef childActor;
public ParentActor() {
this.childActor = getContext().actorOf(Props.create(childActor.class));
}
@Override
public void onReceive(Object msg) {
for (int i=0; i<1000; i++) {
this.childActor.tell("Some message", getSelf());
}
}
}
现在,将它与下面的actor进行比较,后者为每个需要发送的消息生成一个新的子actor。
public class ParentActor extends UntypedActor {
@Override
public void onReceive(Object msg) {
for (int i=0; i<1000; i++) {
final ActorRef childActor = getContext().actorOf(Props.create(childActor.class));
childActor.tell("Some message", getSelf());
}
}
}
谢谢!
答案 0 :(得分:4)
可以使用Routers在akka中向演员分发作品。
我们的想法是将子rsp worker actor的选择移动到消息流中。
请参阅参考文档中的顶部示例。主人创建了一组名为routees的子actor,并将它们添加到路由器:
router = new Router(new RoundRobinRoutingLogic(), routees);
路由器可以配置为使用一组不同的路由逻辑实现,这里是一个简单的循环逻辑。
当消息发送给其中一个子actor时,您可以将其发送到路由器,它关心选择合适的孩子并将其发送到那里:
router.route(msg, getSender());
getSender可用于传递邮件发件人,以防邮件在工作人员中被接收,或者您只是传递'getSelf()'的结果(或者可能只是没有,不确定)直接发送它。 / p>