【问题标题】:How to create multiple actors and keep a list of them in AKKA java?如何在 AKKA java 中创建多个演员并保留他们的列表?
【发布时间】:2020-11-08 02:25:25
【问题描述】:

我正在创建一个演员系统,因此需要将一个演员实例分配给列表中的每个对象,我通过在对象和演员中都有一个名为 uri 的字符串属性来做到这一点,并为它们赋予相同的值弄清楚哪个actor分配给哪个对象,我的系统的意图是允许另一个服务直接向分配给所选对象的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 名称相同,如何解决这个问题?他们是我可以仅通过名称属性来区分演员的一种方式吗?我真的被困住了,任何帮助将不胜感激:)

【问题讨论】:

    标签: java akka actor


    【解决方案1】:

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

    在任何情况下,在 Akka 中,您唯一会看到类型 Actor 的时候是在定义演员的类时(即 class MyActor extends Actor)。 Actor 代表演员的行为,而不是其他代码可以使用的演员(通过使用,我的意思是“发送消息”,因为这基本上是演员唯一擅长的事情),最终由 @987654326 表示@。 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 了,但希望这个想法能够被采纳。

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多