package jframe.netty.http.handler; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.http.HttpContentCompressor; import io.netty.handler.codec.http.HttpRequestDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; import io.netty.handler.ssl.SslContext; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import io.netty.handler.timeout.IdleStateHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author dzh * @date Jul 25, 2014 1:24:54 PM * @since 1.0 */ public class HttpServerInitializer extends ChannelInitializer<SocketChannel> { static Logger LOG = LoggerFactory.getLogger(HttpServerInitializer.class); private SslContext sslCtx; private HttpReqDispatcher reqDis = new HttpReqDispatcher(); public HttpServerInitializer() { this(null); } public HttpServerInitializer(SslContext sslCtx) { this.sslCtx = sslCtx; } @Override public void initChannel(SocketChannel ch) { ChannelPipeline p = ch.pipeline(); // p.addLast("log", new LoggingHandler(LogLevel.ERROR)); if (sslCtx != null) { p.addLast(sslCtx.newHandler(ch.alloc())); } p.addLast(new HttpRequestDecoder()); p.addLast(new HttpResponseEncoder()); p.addLast("http compressor", new HttpContentCompressor()); // p.addLast(new HttpObjectAggregator(1048576)); p.addLast("http dispatcher", reqDis); p.addLast("idleStateHandler", new IdleStateHandler(10, 10, 0)); p.addLast("heartbeatHandler", new HeartbeatHandler()); } @Sharable public class HeartbeatHandler extends ChannelDuplexHandler { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.ALL_IDLE) { ctx.close(); LOG.info("close ALL_IDLE {}", evt.toString()); } else if (e.state() == IdleState.READER_IDLE) { ctx.close(); LOG.info("close READER_IDLE {}", evt.toString()); } else if (e.state() == IdleState.WRITER_IDLE) { ctx.close(); LOG.info("close WRITER_IDLE {}", evt.toString()); } } } } }