netty - 当响应时间超过 requestReadTimeoutSeconds 时,KTor 将终止 GET 请求
问题描述
基于requestReadTimeoutSeconds
. 这些是 GET 请求,因此没有要发送的正文。
它设置为 25,请求在 25 秒后终止,我将其更改为 15 秒,然后它在 15 秒后开始终止。
即使响应很大,我们也会确保“立即”开始流回结果。我还可以从客户端看到我们开始接收内容,但连接被终止。
requestReadTimeoutSeconds
假设这不应该影响 GET 请求,我错了吗?它不应该在收到其他请求的正文后超时吗?或者也许没有办法弄清楚客户何时“完成”接收?
谢谢,安德斯
解决方案
从NettyrequestReadTimeoutSeconds
直接映射到ReadTimeoutHandler
(https://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 。
推荐阅读
- system-verilog - 是否可以在分配语句之外在 SystemVerilog 中调用 new ?
- magento-1.9 - Magento 1 如何即时设置定期付款初始费用?
- webpack - 使用 webpack 在没有 js 导入的情况下观看和编译 sass
- java - 尝试启动片段时应用程序强制关闭
- java - 创建方法后如何使用 SQLiteDatabase?
- jquery - 为什么图像滑块水平加载图像而不是幻灯片?
- sql - 从不同的数据库重命名表和视图,在编辑器中工作,但不能从存储过程
- android - 任务“:app:compileDebugJavaWithJavac”执行失败:
- html - 来自 Web API 的聚合物数据绑定
- angular - 角度传递参数给函数