Я работаю над приложением чата, используя WebSockets (в Play 2.3 с scala). Сообщение должно быть передано всем пользователям или определенному набору пользователей на основе входящего сообщения. Один пользователь может участвовать более чем в одном групповом чате и общаться с отдельными людьми одновременно.
Concurrent.broadcast[JsValue]
возвращает кортеж(enumerator, channel)
. Я не знаю, как применить фильтр к этому каналу, поэтому сообщение получит только определенная группа клиентов.
Мы можем применять фильтры к перечислителю, например (перечислитель &> Enumeratee.filter[JsValue] {...}). но мы не можем отправлять сообщения через этот перечислитель.
Я не хочу анализировать сообщение на стороне клиента. Мой код выглядит так,
val (public_enumerator, public_channel) = Concurrent.broadcast[JsValue]
def chat = WebSocket.using[JsValue] { request =>
val in = Iteratee.foreach[JsValue]{ msg =>
public_channel.push(msg)
}.map { _ =>
// Quit connection
}
(in ,public_enumerator)
}
Большинство примеров, которые я нашел в Интернете, используют устаревшие методы, некоторые из них удалены в Play 2.3 (например, Enumerators.imperative). Я не знаю, как работает Concurrent.unicast
.
Я хотел бы знать, есть ли другой способ сделать то же самое с помощью Актеров. Мне также хотелось бы знать, что этот дизайн выдержит более высокую нагрузку (более 1000 пользователей). Спасибо.