http - 关于使用 netty 关闭简单 http 服务器的空闲连接的问题
问题描述
我们正在使用 netty 设置一个简单的 http 服务器,就像 netty 源代码中的示例一样。
众所周知,在 http 1.1 中,服务器在向客户端写入响应后并没有关闭 tcp 连接,所以我们使用 IdleStateHandler 在一定时间后关闭空闲连接,例如 30 秒。代码如下。
public class MyChannelInitializer extends ChannelInitializer<Channel> {
@Override
public void initChannel(Channel channel) {
channel.pipeline().addLast("idleStateHandler", new IdleStateHandler(0, 0, 30));
channel.pipeline().addLast("myHandler", new MyHandler());
}
}
public class MyHandler extends ChannelDuplexHandler {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
ctx.close();
}
}
}
这按预期工作,这意味着服务器将在最后一次响应后 30 秒后关闭连接。
但是,问题是,如果服务器正在处理一个非常慢的请求,因此处理时间大于 30 秒,IdleStateHandler 会在这种情况下关闭连接,我们认为这是意料之外的。
这是预期的行为吗?像tomcat/jetty这样复杂的http服务器如何处理这个?谢谢。
解决方案
修改您的处理程序以在启动长请求时从管道中删除 IdleStateHandler 并在完成时将其添加回来。
推荐阅读
- javascript - 在 React 中为 axios 编写 POST 调用
- java - 如何将 Spring-Integration Kafka InboundGateway 和 OutboundGateway 与 MessageConverter 一起使用?
- java - OWLAPI SWRL 问题:内置使用不安全的变量
- python - 使用python regex从pdf中提取特定数据
- javascript - 单击按钮时打印 iframe - TypeScript
- c++ - 返回 const 引用参数而不复制
- javascript - SharePoint 的 Chart.js 问题
- python - BeautifulSoup 抓取二手车列表
- amazon-s3 - Apache Iceberg 索引 AWS S3
- css - 如何使具有对象匹配的弹性框覆盖正常工作