繁体   English   中英

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

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

我正在创建一个演员系统,以便需要将一个演员实例分配给列表中的每个 object,我通过在 object 和演员中都有一个名为 uri 的字符串属性来做到这一点,并给它们相同的值来找出哪个actor被分配给哪个object,我的系统的意图是允许另一个服务直接向分配给所选object的Actor发送消息

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,但希望这个想法能够得到实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM