2016-03-15 39 views
0

在我的Netty基于HTTP服务器,我添加了添加和删除写Idlestatehandler

@Override 
protected void initChannel(Channel channel) throws Exception { 
    ChannelPipeline pipeline = channel.pipeline(); 
    pipeline.addLast("KeepAlive_Handler", new IdleStateHandler(readTimeout, 0, 0)); 
    pipeline.addLast("Timeout_Handler", new IdleStateHandler(0, writeTimeOut, 0)); 

    addSSLServerHandler(pipeline); 
    pipeline.addLast("http-decoder", new HttpRequestDecoder(4096, 16384, 16384)); 
    pipeline.addLast("http-encoder", new HttpResponseEncoder()); 

    pipeline.addLast("Reuqest_Handler", new RequestHandler()); 
} 

在RequestHandler,HTTP请求被处理后,即响应发送回客户端,我从管线上拆下的“Timeout_Handler”并且通道连接保持打开状态,除非发生KeepAlive_Handler事件或引发一些致命异常。

我不确定是来自ChannelInitializer的initChannel()总是为每个Http请求调用,或者有些情况下它不被调用?这很重要,因为我在每个Http请求之后删除“Timeout_Handler”,并且如果initChannel()未针对某些Http请求调用,那么肯定会在没有“Timeout_Handler”的情况下处理这些请求。

+1

无论何时创建新的通道(连接),都会调用initChannel,而不是在请求之间。 –

回答

0

为每个代表连接的新通道调用initChannel(...)。所以没有它不是每个请求调用。

+0

我如何确保对于每个请求(包括ssl握手),当我的服务器读取第一个字节的“写超时处理程序”添加到管道和请求完成时(无论响应),这个“写超时处理程序”已移除???换句话说,每个请求必须有一个“写超时处理程序”的新实例 – user3027786

+0

任何建议? – user3027786