我可以为某些演员的自动名称添加前缀吗?

Can I give prefixes to some actors' automatic names?

我有一些 Akka 项目,我有以下场景:我有很多演员,我想要一个 human-readable 名字,但与此同时,我不想生成我自己为每个人起独特的名字。那么,有没有办法告诉道具或演员系统在 automatically-generated 名称前加上一个特定的字符串?

例如,我有一些 actor Master 创建了一些 children 类型的 Worker。我希望每个 children 的名称都以 "worker-" 开头,这样我就可以轻松地在日志中跟进。另外,如果可能的话,我想知道是否有其他方法可以更 fine-grained 时尚地命名演员。

提前致谢。

编辑:这是我想要的例子

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

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

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

2) 用 user-specified 名字创建演员

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

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

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

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

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

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

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

正如@VinceEmigh 在评论中提到的,API 不支持此功能。此外,Akka 团队没有计划很快(或根本没有)支持它。有关此内容的更多信息 here.