Ktor 2 HttpClient webSocket генерирует HttpRequestTimeoutException при использовании CIO
Пробую получать обновления с биржи Binance по веб сокету и да же на простейшем случае получаю HttpRequestTimeoutException. Вот пример кода
class TestEmptyWebsocket: Subcommand("${Contracts.PREFIX}-test-empty-web-socket", "Test empty web socket") {
private val webSocketHost: String = "stream.binance.com"
private val webSocketPort: Int = 9443
private val dispatcher: CoroutineDispatcher = newSingleThreadContext("test-binance")
private val rootJob = Job()
private val currentScope = CoroutineScope(dispatcher + rootJob)
private val logger = KotlinLogging.logger(TestEmptyWebsocket::class.java.canonicalName)
private val webSocketClient = HttpClient(CIO) {
install(WebSockets) {
pingInterval= 1000
}
install(HttpTimeout){
requestTimeoutMillis=10000
}
defaultRequest {
url {
host = webSocketHost
protocol = URLProtocol.WSS
port = webSocketPort
}
}
}
override fun execute()= runBlocking {
val thirdJob = currentScope.launch {
val startTime=Clock.System.now()
try {
webSocketClient.webSocket(
request = {
url {
protocol = URLProtocol.WSS
encodedPath = "/stream?streams=sysbtc@depth@100"
}
}
) {
while (true) {
when (val incoming = incoming.receive()) {
is Frame.Text -> logger.info { "get text ${incoming.readText()}" }
else -> logger.info { "get not text frame" }
}
}
}
}catch (ex:HttpRequestTimeoutException){
logger.error(ex) { "stop coroutine after ${(Clock.System.now()-startTime).inWholeMilliseconds} ms" }
this.cancel()
}
}
thirdJob.join()
}
}
При этом получаю сообщение stop coroutine after 10015 ms То есть через timeout который сам установил. Использую ktor версии ktorVersion=2.0.2. В проекте подключены следующие зависимости
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-logging:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
implementation("io.ktor:ktor-client-websockets:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
Вопрос, как сделать так, что бы Ktor клиент ждал дольше данного timeout ?
Ответы (1 шт):
Автор решения: Ефимов Евгений
→ Ссылка
Добавил вот такой код перестало вылетать
install(HttpTimeout) {
requestTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS
}