项目用的Netty4.1编写, 情况是运行一段时间后,监听端口就接收不到前端请求,大概过1分钟自动又恢复,貌似运行越久这种状况出现的越是频繁。上线时并发测试还挺不错的。就是这个问题折腾到现在反复重现,求救大神。
关键代码如下:
EventLoopGroup bossGroup = new NioEventLoopGroup(); //定义一个线程组,这个线程组的作用是用来接收客户端的连接
EventLoopGroup workerGroup = new NioEventLoopGroup(); //定义一个线程组,这个线程组用来处理业务逻辑
final EventExecutorGroup e2=new DefaultEventExecutorGroup(32);
try
{
ServerBootstrap b = new ServerBootstrap(); //定义一个ServerBootstarp类,这个类用来初始化netty服务器
//将两个线程组绑定到ServerBootstarp中,channel使用的模式为非阻塞模式
b.group(bossGroup, workerGroup);
b.channel(NioServerSocketChannel.class);
b.childHandler(new ChannelInitializer<SocketChannel>()
{
int i = 0;
@Override
//当有连接接入的时候会调用这个方法
public void initChannel(SocketChannel ch) throws Exception
{
//server端发送的是httpResponse,所以要使用HttpResponseEncoder进行编码,将HttpResponse转化为ByteBuffer
ch.pipeline().addLast(new HttpResponseEncoder());
//server端接收到的是httpRequest,所以要使用HttpRequestDecoder进行解码,将HttpRequset解码为ByteBuffer
ch.pipeline().addLast(new HttpRequestDecoder());
//处理接收HTTP报文不全的特殊设置
ch.pipeline().addLast("aggregator", new HttpObjectAggregator(3200));
//收到客户端的连接之后就调用HttpServerInboundHandler来处理
//ch.pipeline().addLast(new HttpServerInboundHandler());
ch.pipeline().addLast(e2,new HttpServerInboundHandler());
}
});
b.option(ChannelOption.SO_BACKLOG, 1024);
b.childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS,30);
b.childOption(ChannelOption.SO_KEEPALIVE, false);
ChannelFuture f = b.bind(port).sync(); //和套接字的绑定类似,监听班底的port端口
f.channel().closeFuture().sync(); //等待结束