我有一个演员系统。我想记录(测试)系统中的所有actor(地址/路径)
我试着打电话
ActorSelection actorSelection = context().actorSelection("akka://*");
System.out.println(Arrays.asList(actorSelection.path()));
其中一个根演员。它打印
[akka:, ^\Q\E.*\Q\E$]
但事实上,我知道我的系统中有更多的演员和工作。获取此列表的正确方法是什么?
答案 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的多个实例。
希望它有所帮助。