Akka:创造许多儿童演员而不是重复使用单个儿童演员

时间:2015-03-10 06:20:44

标签: java akka actor

我对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());
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:4)

可以使用Routers在akka中向演员分发作品。

我们的想法是将子rsp worker actor的选择移动到消息流中。

请参阅参考文档中的顶部示例。主人创建了一组名为routees的子actor,并将它们添加到路由器:

router = new Router(new RoundRobinRoutingLogic(), routees);

路由器可以配置为使用一组不同的路由逻辑实现,这里是一个简单的循环逻辑。

当消息发送给其中一个子actor时,您可以将其发送到路由器,它关心选择合适的孩子并将其发送到那里:

router.route(msg, getSender());

getSender可用于传递邮件发件人,以防邮件在工作人员中被接收,或者您只是传递'getSelf()'的结果(或者可能只是没有,不确定)直接发送它。 / p>