Как создать новый чат с игровой рамкой websocket? - PullRequest
0 голосов
/ 02 июня 2019

Я попробовал пример чата с websocket в игровой среде 2.6.x.Работает нормально.Теперь для реального приложения мне нужно создать несколько чатов на основе пользовательских запросов.И пользователи смогут получить доступ к различным чаты с идентификатором или что-то.Я думаю, что это может быть связано с созданием нового потока для каждой комнаты.Связанный код здесь:

   private val (chatSink, chatSource) = {
    val source = MergeHub.source[WSMessage]
      .log("source")
      .map { msg =>
      try {
        val json = Json.parse(msg)
        inputSanitizer.sanText((json \ "msg").as[String])
      } catch {
        case e: Exception => println(">>" + msg)
          "Malfunction client"
      }
    }
     .recoverWithRetries(-1, { case _: Exception ⇒ Source.empty })

    val sink = BroadcastHub.sink[WSMessage]
    source.toMat(sink)(Keep.both).run()
  }

  private val userFlow: Flow[WSMessage, WSMessage, _] = {
    Flow.fromSinkAndSource(chatSink, chatSource)
  }

Но я действительно не знаю, как создать новый поток с идентификатором и получить к нему доступ позже.Может ли кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 01 июля 2019

Я наконец понял это. Опубликуйте решение здесь, если у кого-то есть подобные проблемы. Мое решение состоит в том, чтобы использовать AsyncCacheApi для хранения Flow s в кеше с ключами. При необходимости создайте новый Flow вместо создания только одного Sink и Source:

val chatRoom = cache.get[Flow[WSMessage, WSMessage, _]](s"id=$id")
chatRoom.map{room=>
    val flow = if(room.nonEmpty) room.get else createNewFlow
    cache.set(s"id=$id", flow)
    Right(flow)
}
def createNewFlow: Flow[WSMessage, WSMessage, _] = {
    val (chatSink, chatSource) = {
      val source = MergeHub.source[WSMessage]
        .map { msg =>
         try {
           inputSanitizer.sanitize(msg)
         } catch {
           case e: Exception => println(">>" + msg)
             "Malfunction client"
         }
       }
       .recoverWithRetries(-1, { case _: Exception ⇒ Source.empty })

     val sink = BroadcastHub.sink[WSMessage]
     source.toMat(sink)(Keep.both).run()
   }
   Flow.fromSinkAndSource(chatSink, chatSource)
 }
...