netty 添加自己的业务线程池

public class NettyServer implements ServletContextListener {

    private static Logger log = Logger.getLogger(NettyServer.class);

    /*线程数量不宜设置过高,线程切换非常耗时*/
    public static final EventExecutorGroup exec = new DefaultEventExecutorGroup( Runtime.getRuntime().availableProcessors()*2,
            (ThreadFactory) r -> {
                Thread thread = new Thread(r);
                thread.setName("custom-tcp-exec-"+r.hashCode());
                return thread;
                },
            100000,
            RejectedExecutionHandlers.reject()
    );

    //boss线程监听端口,worker线程负责数据读写
    public static final EventLoopGroup boss = Epoll.isAvailable()? new EpollEventLoopGroup(1) : new NioEventLoopGroup(1);
    public static final EventLoopGroup worker = Epoll.isAvailable()? new EpollEventLoopGroup() : new NioEventLoopGroup();
    
    /**
      * 功能描述:omcat服务器启动时,netty启动
      * @return void
      * @Author: guoliangbo
      * @Date: 2019/9/24 13:18
      */
    public static void nettyStart(ApplicationContext applicationContext){
        // 初始化websocket
        WebSocket.setApplicationContext(applicationContext);
        // getRedisVal();

        try{
            // 初始化ServerBootstrap实例, 此实例是netty服务端应用开发的入口
            ServerBootstrap bootstrap = new ServerBootstrap();
            // 把两个线程组加入进来 初始化的主从"线程池"
            bootstrap.group(boss,worker);
            // 指定使用NioServerSocketChannel这种类型通道  由于是服务端,故而是NioServerSocketChannel
            bootstrap.channel(Epoll.isAvailable()? EpollServerSocketChannel.class : NioServerSocketChannel.class);
            // 一定要使用去绑定具体的事件处理器
            bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    ChannelPipeline pipeline = socketChannel.pipeline();
                    pipeline.addLast(new StringDecoder());
                    pipeline.addLast(new StringEncoder());
                    //pipeline.addLast(new NettyServerInHandler(applicationContext));
                    pipeline.addLast(exec, "handler", new NettyServerInHandler(applicationContext));
                }
            });
            // 最大的等待连接数 默认128
            bootstrap.option(ChannelOption.SO_BACKLOG,10000);
            // 配置子通道也就是SocketChannel的选项
            // 我们已经有了应用层的心跳检测机制,也不需要开启此参数
            bootstrap.childOption(ChannelOption.SO_KEEPALIVE,false);
            bootstrap.childOption(ChannelOption.TCP_NODELAY,false);
            //bootstrap.childOption(ChannelOption.SO_RCVBUF,1024 * 4);
            //bootstrap.childOption(ChannelOption.SO_SNDBUF,1024 * 4);

            // 绑定并侦听某个端口
            ChannelFuture future = bootstrap.bind(Integer.valueOf(StartOnLoad.NETTY_PORT)).sync();
            Logger.getLogger(NettyServer.class).debug("server start ......");

            MetricsUtils.start();

            future.channel().closeFuture().sync();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            boss.shutdownGracefully();
            worker.shutdownGracefully();
        }
    }


}

 

posted @ 2021-01-26 10:21  蟑螂恶霸的开发笔记  阅读(1497)  评论(0编辑  收藏  举报