如何用Kotlin的coroutines替换create java Thread?

问题描述 投票:0回答:1

我是Kotlin协同程序的新手。

这里代码与经典线程:

 import com.google.gson.JsonElement
    import com.google.gson.JsonObject
    import com.google.gson.JsonParser
    import com.zaxxer.hikari.HikariConfig
    import com.zaxxer.hikari.HikariDataSource
    import okhttp3.*
    import okio.ByteString
    import org.slf4j.LoggerFactory
    import java.util.concurrent.atomic.AtomicInteger

    object BithumbSocketListener : WebSocketListener() {

        override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
            super.onFailure(webSocket, t, response)
            Thread {
                оkHttpClient.newWebSocket(wsRequest, BithumbSocketListener)
            }.start()
        }

        override fun onMessage(webSocket: WebSocket, text: String) {
            super.onMessage(webSocket, text)
            logger.debug("ws_onMessage: text = $text")
        }

    }

    fun main(args: Array<String>) {
        currenciesList = currencies.split(",")
        currenciesList.forEach {
            OkHttpClient().newWebSocket(wsRequest, BithumbSocketListener)
        }
    } 

如你所见,我有货币清单(currenciesList)。我迭代它并为列表的每个项目调用newWebSocket。正如你所看到的,BithumbSocketListener是一个单身人士。

如果Web套接字有问题,那么调用回调方法onFailure并在单独的java线程中创建新的web套接字:

        Thread {
            оkHttpClient.newWebSocket(wsRequest, BithumbSocketListener)
}.start()

尼斯。它工作正常。但我想用Kotlin协同代替这个代码。我怎么能这样做?

谢谢。

kotlin-coroutines
1个回答
1
投票

由于您正在处理异步消息流,因此您应该通过实现一个actor将其移植到协同程序,例如

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.