Как сохранить соединение клиента websocket и отправить его позже с помощью akka-streams и akka-http - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь следовать этой части akka-http документации , где говорится об асинхронной обработке сообщений веб-сокетов

Я пытаюсь сделать следующее:

  1. Получение запроса веб-сокета для клиента
  2. Предоставить клиенту счет на оплату
  3. Запустите фоновый процесс, в котором сохранено соединение веб-сокета клиента, и, когда клиент оплачивает свой счет, отправьте данные, о которых он запрашивал, взамен («Мир») в этом случае.

Вот код, который у меня пока есть

def hello: Route = {
  val amt = 1000
  val helloRoute: Route = pathPrefix(Constants.apiVersion) {
  path("hello") {
    val source: Source[Message, SourceQueueWithComplete[Message]] = {
      Source.queue(1, OverflowStrategy.backpressure)
    }

    val paymentRequest = createPaymentRequest(1000, extractUpgradeToWebSocket)
    Directives.handleWebSocketMessages(
      paymentFlow(paymentRequest)
    )
    }
  }
  helloRoute
}

private def createPaymentRequest(amt: Long, wsUpgrade: Directive1[UpgradeToWebSocket]) = {
    val httpResponse: Directive1[HttpResponse] = wsUpgrade.map { ws =>
      val sink: Sink[Message, NotUsed] = Sink.cancelled()
      val source: Source[Message, NotUsed] = Source.single(TextMessage("World"))
      val x: HttpResponse = ws.handleMessagesWithSinkSource(sink, source)
      x
    }
    httpResponse.map { resp =>
      //here is where I want to send a websocket message back to the client
      //that is the HttpResponse above, how do I complete this? 
      Directives.complete(resp)
  }

}

Что я не могу понять, так это как получить доступ к RequestContext или UpgradeToWebSocket вне контейнера типа Directive? И когда я отображаю на httpResponse карта не выполняется.

...