首页 > 解决方案 > 当响应时间超过 requestReadTimeoutSeconds 时,KTor 将终止 GET 请求

问题描述

基于requestReadTimeoutSeconds. 这些是 GET 请求,因此没有要发送的正文。

它设置为 25,请求在 25 秒后终止,我将其更改为 15 秒,然后它在 15 秒后开始终止。

即使响应很大,我们也会确保“立即”开始流回结果。我还可以从客户端看到我们开始接收内容,但连接被终止。

requestReadTimeoutSeconds假设这不应该影响 GET 请求,我错了吗?它不应该在收到其他请求的正文后超时吗?或者也许没有办法弄清楚客户何时“完成”接收?

谢谢,安德斯

标签: nettyktor

解决方案


从NettyrequestReadTimeoutSeconds直接映射到ReadTimeoutHandlerhttps://netty.io/4.0/api/io/netty/handler/timeout/ReadTimeoutHandler.html):所以这是配置Netty内部的方式。

官方网络文档说:

Raises a ReadTimeoutException when no data was read within a certain period of time.

超时是指网络读取,因此它是预期的行为。

您可以在这里做的是编写自定义功能:例如:

class Timeouts {
    class Config(var postRequestTimeout: Long = 5000L)

    companion object : ApplicationFeature<ApplicationCallPipeline, Config, Unit> {
        override val key: AttributeKey<Unit> = AttributeKey("Timeouts")

        override fun install(pipeline: ApplicationCallPipeline, configure: Config.() -> Unit) {
            val postTimeout = Config().apply(configure).postRequestTimeout
            if (postTimeout <= 0) return

            pipeline.intercept(ApplicationCallPipeline.Features) {
                if (call.request.httpMethod != HttpMethod.Post) return@intercept

                withTimeout(postTimeout) {
                    proceed()
                }
            }
        }
    }
}

这是要点:https ://gist.github.com/e5l/31bcf22a813008bd7418b5c944b225c9

并安装它:

install(Timeouts) {
   postRequestTimeout = 5000 // in ms
}

此功能允许您直接设置发布请求的超时时间。

如果您在功能请求中描述您在此处的用例,我们将很高兴:https ://github.com/ktorio/ktor/issues 。


推荐阅读