我如何获得演员系统中的所有演员

时间:2017-04-27 15:47:11

标签: java akka

我有一个演员系统。我想记录(测试)系统中的所有actor(地址/路径)

我试着打电话

ActorSelection actorSelection = context().actorSelection("akka://*");
System.out.println(Arrays.asList(actorSelection.path()));

其中一个根演员。它打印

[akka:, ^\Q\E.*\Q\E$]

但事实上,我知道我的系统中有更多的演员和工作。获取此列表的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

ActorSystem打开了printTree方法,因此请使用类似于

的方法
   ActorSystem<Object> actors = ActorSystem.create(...);
   System.out.println(actors.printTree());

答案 1 :(得分:0)

如果是出于测试目的,我会创建一个具有此行为的专用RetrieveActors actor(akka v2.4.17语法):

import akka.actor.*;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class RetrieveActors extends UntypedActor {
    private LoggingAdapter log = Logging.getLogger(getContext().system(), this);
    private String identifyId;

       public RetrieveActors(String identifyId) {
           this.identifyId = identifyId;
       }

       @Override
       public void preStart() {
           ActorSelection selection = getContext().actorSelection("/*");
           selection.tell(new Identify(identifyId), getSelf());
       }

       @Override
       public void onReceive(Object message) throws Throwable {
           if (message instanceof ActorIdentity) {
               ActorIdentity identity = (ActorIdentity) message;

               if (identity.correlationId().equals(identifyId)) {
                   ActorRef ref = identity.getRef();

                   if (ref != null) { // to avoid NullPointerExceptions
                       // Log or store the identity of the actor who replied
                       log.info("The actor " + ref.path().toString() + " exists and has replied!");

                       // We want to discover all children of the received actor (recursive traversal)
                       ActorSelection selection = getContext().actorSelection(ref.path().toString() + "/*");
                       selection.tell(new Identify(identifyId), getSelf());
                   }

               }

           }
       }
}

然后,当您想要列出所有创建的演员时,只需创建RetrieveActors的新实例:

// "1" is the identifyId to make your retrieval calls unique to this actor instance
system.actorOf(Props.create(RetrieveActors.class, "1"), "LookupActor1");

请注意,如果这些模式使用普通邮件和邮箱,某些参与者可能会很忙,因为他们很忙。此外,可能无法保证交货。您将仅检索已创建的actor。更多信息here

如果您需要多次获取akka系统中的所有actor,我建议您修改RetrieveActors行为,以便在某些自定义消息的反应中执行actor检索,而不是在初始化时执行。这可能会避免您创建同一个Actor的多个实例。

希望它有所帮助。