如何在AKKA java中创建多个参与者并保存它们的列表?

cpjpxq1n  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(122)

我正在创建一个参与者系统,需要为列表中的每个对象分配一个参与者示例,为此,我在对象和参与者中都有一个名为uri的String属性,并为它们赋予相同的值,以确定哪个参与者分配给哪个对象,我的系统的目的是允许另一个服务直接向分配给所选对象的参与者发送消息

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名称,如何解决这个问题?我可以通过名称属性单独区分演员吗?我真的被卡住了,任何帮助都将不胜感激:)

ffscu2ro

ffscu2ro1#

既然Map符合要求,为什么还要使用List
在任何情况下,在Akka中,您唯一看到类型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了,但是希望这个想法能被接受。

相关问题