【问题标题】:problem about closing idle connection for simple http server with netty关于使用 netty 关闭简单 http 服务器的空闲连接的问题
【发布时间】:2019-08-22 20:03:45
【问题描述】:

我们正在用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服务器如何处理这个?谢谢。

【问题讨论】:

    标签: http netty


    【解决方案1】:

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

    【讨论】:

    • 尼古拉斯,我的意思是一般用途,而不是特定情况。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2012-06-10
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多