【问题标题】:Can I give prefixes to some actors' automatic names?我可以给某些演员的自动名字加上前缀吗?
【发布时间】:2015-02-28 12:02:29
【问题描述】:

我有一些 Akka 项目,我有以下场景:我有很多演员,我希望有一个人类可读的名字,但同时,我不想为每个演员生成唯一的名字我一个人。那么,有没有办法告诉道具或演员系统在自动生成的名称前加上一个特定的字符串?

例如,我有一些演员 Master,他创建了一些 Worker 类型的孩子。我希望每个孩子的名字都以“worker-”开头,这样我就可以在日志中轻松跟踪。另外,如果可能的话,我想知道是否有其他方法可以更细粒度地命名演员。

提前致谢。

编辑:这是我想要的示例

目前,据我所知,您有两种选择:

1) 使用自动生成的名称创建actor

ActorRef myActor = mySystem.actorOf(MyActor.props());

2) 使用用户指定的名称创建参与者

ActorRef myActor = mySystem.actorOf( MyActor.props(), MyNamingAPI.getSomeNewName() );

1) 不好,因为在日志中我不知道谁是谁。 2) 不好,因为我必须编写/使用我自己的 API,而且如果其他人使用我的演员项目​​作为子系统,他必须小心不要重复名称或使用不同的演员系统。所以,它不是便携式的。

我希望 Akka 支持类似的东西:

ActorRef myActor = mySystem.actorOf(MyActor.props(), "my-actor-%");

其中 % 符号表示自动生成的 ID。

【问题讨论】:

  • 遗憾的是,API 不支持此功能。如果不自己生成名称或使用在后台生成名称的 API,您将无法做到。

标签: java scala akka actor


【解决方案1】:

看看下面的方法是否可行。基本上,您可以在创建工作角色时将序列号传递给它们。这样你就可以与他们联系起来。

import akka.actor.{Props, ActorSystem, Actor}


object ActorNaming extends App {

  implicit val actorSys = ActorSystem("NameDemoAS")

  val master = actorSys.actorOf(Props[Master], "my-name-is-master")
  master ! "name"

  (1 to 10).map{ i => actorSys.actorOf(Props[Worker], s"my-name-is-worker-$i")}.map{ actor => actor ! "name"}

}


class Master extends Actor {

  def receive : Receive = {
    case "name" => println(context.self.path.name)
  }
}

class Worker extends Actor {
  def receive : Receive = {
    case "name" => println(context.self.path.name)
  }
}

输出是

my-name-is-master
my-name-is-worker-1
my-name-is-worker-2
my-name-is-worker-7
my-name-is-worker-3
my-name-is-worker-4
my-name-is-worker-8
my-name-is-worker-5
my-name-is-worker-6
my-name-is-worker-9
my-name-is-worker-10

【讨论】:

  • 感谢您的回答!当然有效,但在我的问题中,我说“我不想自己为每个人生成唯一的名称”。生成唯一名称的可能性是无限的,样板文件并不是很重要,因为您只需编写一次并重复使用它。我的问题是 API 是否支持一种简洁的方式。
  • 哦,好吧。您能否提供一个示例(伪代码),说明希望使用哪种 API 来生成名称。但是你认为这样的东西应该成为标准 API 的一部分吗?你想让名字完全随机吗? IMO,命名可以是高度上下文特定和域驱动的。
  • “我不想自己为每个角色生成唯一的名字”——这些演员是你自己创造的吗?
  • 我自己创造了这些演员,是的。我编辑了问题以包含我想要的示例。谢谢。
  • 谢谢。我认为你的问题现在更清楚了。
【解决方案2】:

正如 @VinceEmigh 在 cmets 中提到的,API 不支持此功能。此外,Akka 团队没有计划很快(或根本没有)支持它。更多关于这个here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多