首页 > 解决方案 > 关于使用 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服务器如何处理这个?谢谢。

标签: httpnetty

解决方案


修改您的处理程序以在启动长请求时从管道中删除 IdleStateHandler 并在完成时将其添加回来。


推荐阅读