Как использовать Play Framework 2.8 WebSocket с Sink и Source? - PullRequest
0 голосов
/ 21 апреля 2020

Я думаю, что я хотел бы использовать Play's и Akka in: Sink и out: Source для WebSocket (вместо создания актера). Я до сих пор не могу понять, как это сделать.

Как я могу отправлять сообщения в «исходящий» источник? Как мне закрыть входы и выходы? Как мне узнать, закрыл ли клиент соединение?

Я посмотрел Nodejs Документы WebSocket: https://github.com/websockets/ws#echowebsocketorg -demo :

  • Там есть: ws.send('hello client'); - могу ли я как-нибудь использовать Play's out так же?
  • Там: ws.on('message' ... - я могу использовать Sink.foreach() для этого, верно
  • И ws.on('close' ... - какое-нибудь событие закрытия 'Sink / Source' каким-либо образом?
  • и ws.close(); - как мне сделать это с in Out Sink Source ?

Или следует Я использую что-то еще, кроме in: Sink и out: Source? Я бы предпочел не создавать актера (или у меня тоже есть вопросы по этому поводу - это будет другая топи c).

***

Вот пример в Документация к пьесе :

// Log events to the console
val in = akka.stream.scaladsl.Sink.foreach[String](println)

// Send a single 'Hello!' message and then leave the socket open
val out = akka.stream.scaladsl.Source.single("Hello!")
  .concat(akka.stream.scaladsl.Source.maybe)

Но это заставляет меня задуматься, как закрыть источник 'in' Sink and 'out' (через некоторое время, а не сразу)
и как мне это сделать знать, когда клиент их закрывает. И как отправлять полезные сообщения «out»: глядя на Исходные документы , я не могу найти ничего, что можно было бы использовать для отправки различных сообщений позже , на «out» , Может быть, метод ask? "Используйте шаблон запроса, чтобы отправить сообщение-запрос-ответ целевому действующему субъекту" - мне неясно, что это значит.

1 Ответ

1 голос
/ 21 апреля 2020

Идея в этом случае заключается в использовании потока "fromSinkAndSource" (https://doc.akka.io/docs/akka/current/stream/operators/Flow/fromSinkAndSource.html), который потребует от вас Sink (который будет принимать сообщения, поступающие от клиента (тип *) 1005 *)) и Source (которые будут использоваться для отправки сообщений клиенту (введите Out)).

Как вы сказали, приемник может использовать некоторый оператор foreach, как вы сказали (возможно, есть лучшие варианты, но сейчас я думаю, что это нормально).

Для источника я бы предложил вам использовать Source.queue (https://doc.akka.io/docs/akka/current/stream/operators/Source/queue.html). Если у вас есть очередь, вы можете прекратить ее, вызвав метод complete. Однако обратите внимание, что вам нужно будет где-то отслеживать ссылку на источник со ссылкой на то, с каким клиентом он связан.

Надеюсь, это поможет.

...