【问题标题】:InvalidActorNameException - actor name {name} is not uniqueInvalidActorNameException - 演员名称 {name} 不是唯一的
【发布时间】:2012-12-28 15:19:45
【问题描述】:

所以我开始在我的 Play 2.0 应用中使用 Akka Actor。我很快注意到重复调用向同一个actor发送消息,通过以下方式指定:

val myActor = Akka.system.actorOf(Props[MyActor], name = "myactor")

导致InvalidActorNameException

然后我开始在doc 中阅读有关创建 Actors 的内容

文档似乎建议创建一个“主”Actor 类,其中指定了所有单独的 Actor。该 Actor 类的 receive 将依次匹配消息并将消息委托给适当的 Actor。

所以我尝试了这个,现在有类似的东西:

class MasterActor extends Actor{
  import context._
  val emailActor = actorOf(Props[EmailActor], name = "emailActor")
  protected def receive = {
    case reminder : BirthdayReminder => emailActor ! reminder
  }

}

问题是我的情况与以前相同。当我尝试以下操作时,我不知道如何避免InvalidActorNameException

    val myActor = Akka.system.actorOf(Props[MasterActor], name = "MasterActor")
    myActor ! BirthdayReminder(someBirthday)

那么组织我的 Actor 的正确方法是什么?

【问题讨论】:

    标签: scala playframework playframework-2.0 akka


    【解决方案1】:

    如果您只想要一个 MasterActor,为什么要创建多个?您应该只查找您已经创建的那个:

    val actorRef = context.actorFor("MasterActor")
    actorRef ! BirthdayReminder(someBirthday)
    

    【讨论】:

    • 谢谢金。感谢你的帮助。我知道这可能是一个愚蠢的问题,但我最初应该在哪里创建 MasterActor?换句话说,我需要用 system.actorOf 创建它,不是吗?
    • 是的,只要只发生一次,您就可以随心所欲地进行操作。
    • 谢谢金。最后一个问题:如何在扩展 Actor 的类之外获取上下文?该 val 受到保护,但我需要其他地方的上下文...
    • 为什么需要上下文?要查找演员,您还可以使用 ActorSystem.actorFor
    • 有点困惑。对于我的 Play 应用程序,我应该在我的应用程序启动时初始化 MasterActor(Akka.system.actorOf(Props[MasterActor], name = "MasterActor")),然后再调用 val masterActor = Akka.system.actorFor("MasterActor ")?
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多