2013-10-10 82 views
0

我正在查看使用基於Web的聊天室的Play Framework構建的Akka示例。這個例子在這種情況下,只有一個房間,並獲取與以下實例:創建多個Actor並引用它們

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

我想擴大這個例子,並有可用的,而不是僅僅一個多聊天室。用戶可以提供一個字符串,該字符串可以是聊天室的「名稱」,這將創建一個新的聊天室。任何試圖加入這個聊天室的人都會分享彼此的廣播,但不會與另一個聊天室中的人分享。非常類似於IRC。

我的問題有以下幾點:

1:如何創建一個聊天室一個獨特的名字,如果一個已經不存在?
2:如何檢查現有ChatRoom是否存在並獲取對它的引用?

聊天室名稱將通過URL或查詢參數來發送,該部分將是微不足道的。我只是不完全確定如何唯一標識Akka ChatRoom,並稍後通過名稱檢索該Actor。

回答

0

你應該找到這個文件在你的答案:http://doc.akka.io/docs/akka/snapshot/general/addressing.html

系統中的每個演員都有一個與之關聯的路徑,這是非常類似於操作系統的路徑。
例如:akka://my-sys/user/service-a/worker1
這是一個純粹的本地路徑,worker1是您在創建時爲演員命名的名稱。

當你像這樣創建它可以命名你的演員:
context.actorOf(道具[聊天室],名稱=「chatroom1」)

如果您知道路徑,以一個演員,你可以得到一個參考它使用,context.actorSelection("akka://my-sys/user/service-a/chatroom1")

但是,當你做一個context.actorOf它將返回一個ActorRef這是一個參考演員。因此,另一種解決方案是將這些ActorRef存儲起來,並在需要時按名稱查找它們。

這就是說,最好是使用actorRef而不是actorSelection,因爲actorRef綁定到actor的生命週期,而actorSelection只與參考路徑相關聯。當你不是創建演員的人時,ActorSelection非常有用,所以你不需要引用所有你知道的名字,然後你可以查找它們。

雖然一旦您有了演員選擇,您可以通過使用ActorIdentity消息查詢演員來獲得ActorRef

相關問題