Я пытаюсь следовать этой части akka-http
документации , где говорится об асинхронной обработке сообщений веб-сокетов
Я пытаюсь сделать следующее:
- Получение запроса веб-сокета для клиента
- Предоставить клиенту счет на оплату
- Запустите фоновый процесс, в котором сохранено соединение веб-сокета клиента, и, когда клиент оплачивает свой счет, отправьте данные, о которых он запрашивал, взамен («Мир») в этом случае.
Вот код, который у меня пока есть
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
карта не выполняется.