我们正在使用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服务器如何处理此问题?谢谢。
答案 0 :(得分:0)
修改您的处理程序,以在长请求开始时将IdleStateHandler从管道中删除,并在完成后将其重新添加。