创建多个Actors并引用它们

时间:2013-10-10 22:08:18

标签: scala playframework akka

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

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

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

我的问题如下:

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

聊天室名称将通过URL或查询参数来实现,该部分将是微不足道的。我不完全确定如何唯一地识别Akka ChatRoom,然后通过名称检索该Actor。

1 个答案:

答案 0 :(得分:0)

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

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

您可以在创建演员时为其命名:
context.actorOf(Props [ChatRoom],name =“chatroom1”)

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

获得对它的引用

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

那说使用actorRef而不是actorSelection总是更好,因为actorRef与actor的生命周期相关联,而actorSelection只与引用路径相关联。 ActorSelection在你不是创建演员的情况下非常有用,所以你没有它的引用所有你知道的是它的名字,然后你可以查找它们。

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