有关关闭带有netty的简单http服务器的空闲连接的问题

时间:2019-08-22 06:27:32

标签: http netty

我们正在使用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服务器如何处理此问题?谢谢。

1 个答案:

答案 0 :(得分:0)

修改您的处理程序,以在长请求开始时将IdleStateHandler从管道中删除,并在完成后将其重新添加。