我可以为某些演员的自动名称添加前缀吗?
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.
我有一些 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.