我正在查看使用Play Framework构建的基于Web的聊天室的Akka示例。在这种情况下的示例,只有一个房间,并使用以下内容进行实例化:
val room = Akka.system.actorOf(Props[ChatRoom])
我想扩展此示例并提供多个聊天室,而不只是一个。用户可以提供字符串,该字符串可以是聊天室“名称”,并且可以创建新的聊天室。任何试图加入这个聊天室的人都会互相分享广播,但不会与另一个聊天室的人分享广播。与IRC非常相似。
我的问题如下:
1:如果尚未存在具有唯一名称的ChatRoom,如何创建? 2:如何检查现有的ChatRoom是否存在并获得对它的引用?
聊天室名称将通过URL或查询参数来实现,该部分将是微不足道的。我不完全确定如何唯一地识别Akka ChatRoom,然后通过名称检索该Actor。
答案 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
。