Поскольку вы обрабатываете асинхронный поток сообщений, вы должны перенести его на сопрограммы, внедрив актера, такого как
val wsActor: SendChannel<String> = actor {
for (msg in channel) {
logger.info("Another message is in: ${msg}")
}
}
Из типа wsActor
вы можете видеть, что должны отправлять на него сообщения. Вот где вводится код моста:
class BithumbSocketListener(
private val chan: Channel<String>
) : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
chan.send(text)
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
оkHttpClient.newWebSocket(wsRequest, this)
}
}
Обратите внимание, что по сравнению с вашим кодом я не запускаю новые потоки для повторной попытки. Это не имеет ничего общего с портированием на сопрограммы, вашему коду это тоже не нужно. newWebSocket
- это асинхронный вызов, который немедленно возвращается.
Наконец, запустите websockets для каждой валюты:
currenciesList.forEach {
OkHttpClient().newWebSocket(wsRequest, BithumbSocketListener(wsActor)
}