【问题标题】:Creating multiple Actors and referencing them创建多个 Actor 并引用它们
【发布时间】:2013-10-11 06:38:33
【问题描述】:

我正在查看一个使用 Play Framework 构建的基于 Web 的聊天室的 Akka 示例。本例中的示例只有一个房间,并使用以下内容进行实例化:

val room = Akka.system.actorOf(Props[ChatRoom]) 

我想扩展此示例并提供多个聊天室,而不仅仅是一个。用户可以提供一个字符串,它可以是一个聊天室“名称”,这将创建一个新的聊天室。任何尝试加入此聊天室的人都将彼此共享广播,但不会与另一个聊天室中的人共享。与 IRC 非常相似。

我的问题如下:

1:如果尚不存在具有唯一名称的聊天室,如何创建?
2:如何检查现有的ChatRoom是否存在并获得对它的引用?

聊天室名称将来自 URL 或查询参数,这部分将是微不足道的。我只是不完全确定如何唯一标识 Akka ChatRoom,然后按名称检索该 Actor。

【问题讨论】:

    标签: scala playframework akka


    【解决方案1】:

    您应该在本文档中找到答案:http://doc.akka.io/docs/akka/snapshot/general/addressing.html

    系统中的每个参与者都有一个与之关联的路径,这与操作系统中的路径非常相似。
    示例:akka://my-sys/user/service-a/worker1
    这是一个纯粹的本地路径,worker1 是您在创建它时给演员的名称。

    您可以在创建演员时这样命名:
    context.actorOf(Props[ChatRoom], name = "chatroom1")

    如果您知道演员的路径,您可以使用 context.actorSelection("akka://my-sys/user/service-a/chatroom1") 获得对它的引用

    但是,当您执行 context.actorOf 时,它将返回一个 ActorRef,这是对演员的引用。因此,另一种解决方案是存储这些ActorRef,并在需要时按名称查找它们。

    这就是说使用actorRef而不是actorSelection总是更好,因为actorRef与actor的生命周期相关联,而actorSelection与其关联只是一个参考路径。 ActorSelection 在您不是创建演员的人的情况下很有用,因此您没有它的引用,您只知道它的名称,然后您可以查找它们。

    虽然一旦你有一个actorSelection,你可以通过使用ActorIdentity消息查询actor来获得ActorRef

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2022-02-03
      • 1970-01-01
      • 2011-11-26
      • 2021-06-04
      相关资源
      最近更新 更多