gpt4 book ai didi

java - 我如何获得 Actor 系统中的所有 Actor

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:37 24 4
gpt4 key购买 nike

我有一个 Actor 系统。我想记录(用于测试)系统中的所有参与者(地址/路径)

我试过打电话

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

在其中一个根 actor 中。它打印

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

但事实上我知道我的系统中还有更多的参与者在工作。获取此列表的正确方法是什么?

最佳答案

如果是为了测试目的,我会创建一个具有这种行为的专用 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());
}

}

}
}
}

然后当您想列出所有创建的 Actor 时,只需创建一个新的 RetrieveActors 实例:

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

请注意,如果某些 actor 很忙,他们可能需要很长时间才能回答,因为此模式使用普通消息和邮箱。此外,可能无法保证交货。您将仅检索已创建的 Actor 。更多信息 here .

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

希望对您有所帮助。

关于java - 我如何获得 Actor 系统中的所有 Actor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43662389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com