如何创建多个演员并在 AKKA java 中保留他们的列表?

How to create multiple actors and keep a list of them in AKKA java?

我正在创建一个演员系统,这样一个演员实例需要分配给列表中的每个对象,我通过在对象和演员中都有一个名为 uri 的字符串 属性 来做到这一点,并且给他们相同的值以确定哪个演员分配给哪个对象,我的系统的目的是允许另一个服务直接向分配给所选对象的演员发送消息

String[]workers;
ArrayList<Actor> listOfActors = new Arraylist<Actors>();

public WorkerService(ActorSystem system) {
    for(String workerName:workers){
       final ActorRef hello =
        system.actorOf(Props.create(Actor.class),workerName);
       listOfActors.add(hello);
    }

我知道代码有很多流程,即所有演员都使用相同的 ActorRef 名称,如何解决这个问题?他们是我可以仅通过演员的名字 属性 来区分演员的一种方式吗?我真的卡住了任何帮助将不胜感激:)

Map 符合要求时,您为什么要使用 List

无论如何,在 Akka 中,您唯一一次看到类型 Actor 是在定义演员的 class(即 class MyActor extends Actor)时。 Actor 表示一个 actor 的行为,而不是其他代码可以使用的 actor(使用,我的意思是“发送消息给”,因为这基本上是一个 actor 唯一擅长的事情),它最终由一个ActorRef。 Akka Typed 通过 BehaviorActorRef.

消除了这种混淆
String[] workers;
Map<String, ActorRef> actors = new HashMap<String, ActorRef>();

public WorkerService(ActorSystem system) {
  for (String workerName : workers) {
    if (actors.containsKey(workerName)) {
      throw new AssertionError("Should not have duplicate workers...") // or maybe an IllegalArgumentException, depending on how workers is getting set
    } else {
      ActorRef actor = system.actorOf(Props.create(WorkerActor.class), workerName);
      actors.put(workerName, actor)
    }
  }
}

然后,如果您的工作人员服务中的某处需要向具有给定名称的演员发送消息:

ActorRef target = actors.get(name)
if (target != null) {
  target.tell(message)
}

免责声明,我已经很多年没有真正写过任何东西了 Java,但希望这个想法能被理解。