2013-10-10 3 views
0

Я смотрю пример Akka, созданный с помощью платформы Play для веб-чата. Пример в этом случае, имеет только одну комнату и получает экземпляр со следующим:Создание нескольких актеров и их ссылка

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

Я хочу расширить этот пример и иметь в своем распоряжении, а не только один несколько чатов. Пользователь может предоставить строку, которая может быть «именем» в чате, и это создаст новый чат. Любой, кто пытается присоединиться к этому чату, будет делиться трансляцией друг с другом, но не с людьми в другом чате. Очень похоже на IRC.

Мои вопросы следующие:

1: Как создать комнату с уникальным именем, если один уже не существует?
2: Как я могу проверить, существует ли существующий ChatRoom и получить ссылку на него?

Имя чата появится через URL-адрес или параметр запроса, эта часть будет тривиальной. Я просто не совсем уверен, как однозначно идентифицировать Akka ChatRoom, а затем восстановить этого Актера по имени.

ответ

0

Вы должны найти ответ на свой вопрос в этом документе: http://doc.akka.io/docs/akka/snapshot/general/addressing.html

Каждый актер в системе есть путь, связанный с ним, который очень похож на пути в операционных системах.
Пример: akka://my-sys/user/service-a/worker1
Это чисто местный путь, и worker1 - это имя, которое вы дадите актеру при его создании.

Вы можете назвать актера, когда вы создаете его, как это:
context.actorOf (Реквизит [Chatroom], имя = «chatroom1»)

Если вы знаете путь к актеру вы можете получить ссылку к нему с использованием, context.actorSelection("akka://my-sys/user/service-a/chatroom1")

Однако, когда вы сделаете context.actorOf, он вернет ActorRef, который является ссылкой на актера. Таким образом, еще одним решением было бы хранить эти ActorRef и искать их по имени, когда они вам понадобятся.

Это говорит, что всегда лучше работать с actorRef, а не с actorSelection, так как actorRef привязан к жизненному циклу актера, тогда как actorSelection ассоциируется с ним просто ссылкой. ActorSelection полезны в тех случаях, когда вы не создаете актера, и поэтому у вас нет ссылки на все, что вы знаете, это его имя, тогда вы можете найти их.

Если у вас есть актерский отбор, вы можете получить ActorRef, запросив актера, используя сообщение ActorIdentity.

Смежные вопросы