我有一些Akka项目,我有以下场景:我有很多演员,我希望有一个人类可读的名字,但与此同时,我不想生成唯一的名字每个人都是我自己。那么,有没有办法告诉道具或演员系统用自动生成的名称作为特定字符串的前缀?
例如,我有一些演员大师,他创造了一些类型为工人的孩子。我希望每个孩子的名字都以"工人 - "所以我可以轻松地在日志中关注。另外,如果可能的话,我想知道是否还有其他方法可以更精细的方式为演员命名。
提前致谢。
编辑:这是我想要的一个例子
目前,您有两个选择,我可以看到:
1)使用自动生成的名称
创建actorActorRef myActor = mySystem.actorOf(MyActor.props());
2)使用用户指定的名称
创建actorActorRef myActor = mySystem.actorOf( MyActor.props(), MyNamingAPI.getSomeNewName() );
1)很糟糕,因为在日志中我不知道谁是谁。 2)是坏的,因为我必须编写/使用我自己的API,因为如果其他人使用我的actor项目作为子系统,他将不得不小心不重复名称或使用不同的actor系统。所以,它不便携。
我想如果Akka支持以下内容:
ActorRef myActor = mySystem.actorOf(MyActor.props(), "my-actor-%");
其中%符号表示自动生成的ID。
答案 0 :(得分:1)
正如评论中提到的@VinceEmigh,API不支持此功能。此外,Akka团队没有计划很快(或根本)支持它。有关here的更多信息。
答案 1 :(得分:-1)
查看以下内容是否有效。基本上,您可以在创建它们时将seq编号传递给worker actor。这样你就可以回想起来了。
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