【问题标题】:How to create multiple Actors in AKKA by a loop in java?java - 如何通过java中的循环在AKKA中创建多个Actor?
【发布时间】:2020-11-08 06:24:16
【问题描述】:

这只是一个学习示例,我不想为数组中的每个元素创建和分配一个演员,

ActorSystem system = ActorSystem.create("mySystem");
for(String name:namesArray){
  ActorRef myActor = system.actorOf(Props.create(Actor.class),name);
}

这会创建多个actor还是会创建引用同一个actor的actor路径?如果是后者,我如何创建多个演员并为他们分配一个标识符?

【问题讨论】:

  • 何不试试呢?
  • 这是我第一次在 AKKA,我实际上不知道如何测试它,我的目标是创建一个固定数量的演员(从大到硬编码)希望你能在这里帮助我 :)

标签: java akka actor


【解决方案1】:

该代码将:

  • 创建ActorSystem
  • namesArray 中的每个名称创建一个actor(如果名称在数组中第二次出现,它将抛出一个InvalidActorNameException

请注意,编写的这段代码会立即忘记每个创建的演员的ActorRef,这意味着您将无法向它发送消息,除非使用ActorSelection,通常不推荐使用。与此同时,值得注意的是,即使该 Actor 没有 ActorRefs(必须明确停止该 Actor),该 Actor 仍将继续运行。

【讨论】:

  • 非常感谢,如果不是太多,你能解释一下为什么 ActorSelection 不好?在不使用 ActorSelection 的情况下,我可以使用什么解决方法来创建多个演员?
  • 一般来说,使用ActorSelection 更脆弱(因为发送到不存在地址的消息将被丢弃)。使用ActorRef 发送消息更可靠(您至少可以确定您是否有一个ActorRef 确实有一个演员来接收消息(它可能已经停止,但这是与使用ActorSelection 得到什么)。您可以将ActorRefs 保存在集合中(例如Map<String, ActorRef>)并在消息中发送。
  • 在许多情况下有用的另一种替代方法是使用集群分片来管理给定类型的参与者:这允许(特别是与持久性结合使用)参与者被迁移(以保持平衡的方式)跨集群,如果不存在给定 ID 的参与者,将自动生成一个参与者(仅在某些相当罕见的操作场景中,集群分片参与者在您需要时不存在)。
猜你喜欢
  • 2018-07-17
  • 2012-03-27
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多