0

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

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

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

我的问题如下:

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

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

4

1 回答 1

0

您应该在本文档中找到答案: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")

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

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

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

于 2013-10-10T22:32:19.273 回答