我是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协同代替这个代码。我怎么能这样做?
谢谢。
由于您正在处理异步消息流,因此您应该通过实现一个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)
}