【发布时间】: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服务器如何处理这个?谢谢。
【问题讨论】: