2017-02-16 15 views
0

Я использую игровой фреймворк с Scala, Akka и websockets для интерфейса. Я хочу создать сокет для уведомлений для пользователей. Как я могу подключить actorRef с идентификаторами пользователя и проверить, находится ли он в сети или нет?проверка пользователя онлайн или не воспроизведение akka websockets

ответ

1

Вместо того, чтобы думать, «является ли пользователь в сети или нет», просто подумайте, как работают веб-камеры. Интерфейс должен инициировать соединение, поэтому вы автоматически получаете информацию о том, что пользователь подключен к сети (точнее, веб-браузер с зарегистрированным пользователем).

Я бы создал одного актера, который является координатором всех других актеров веб-камеры (актеров, которые непосредственно обрабатывают веб-раскладку). У этого координатора была бы карта userId для Seq [ActorRef]. Это карта, где значения Seq [_], поскольку пользователь может одновременно открывать несколько вкладок браузера (многие actorRefs соответствуют одному userId), и вы должны правильно это обработать. Всякий раз, когда клиент инициирует соединение, будет создан новый актер веб-каталога. В начале этого актера вы можете зарегистрировать его для актера-координатора (переопределить preStart). Когда актер веб-камеры уничтожен (соединение веб-сокета было закрыто), отмените его. Регистрация/отмена регистрации в координаторе приводит к добавлению/удалению actorRef этого websocket к карте.

Чтобы отправить уведомление пользователю (в браузер, в котором клиент входит в систему), отправьте сообщение участнику-координатору, содержащему userId (и остальную часть уведомления, конечно). Этот актер найдет всех участников websocket на карте пользователем и передаст им сообщение.

Техническая сторона WebSockets в Play описан в документации, которые вы, вероятно, уже видели ->https://www.playframework.com/documentation/2.5.x/ScalaWebSockets

обновление: Уточнено, что по actorRefs я имел в виду Seq [ActorRef].

+0

Вместо сохранения actorRefs координатору, могу ли я сохранить его в базе данных? –

+0

Уверен, поэтому вместо актера-координатора у вас будет служба, которая извлекает рефералы для данного пользователя из базы данных всякий раз, когда вы нажимаете какое-либо уведомление. Затем вы отправите это уведомление каждому из этих референтов. –

+0

Я пытался добавить службу, но я получаю исключение при запуске сервисного актера. Пожалуйста, дайте мне несколько ссылок, чтобы я мог понять это, спасибо –