netty-FutureListener机制

起男 82 2024-03-18

netty-FutureListener机制

当Future对象刚刚创建时,处于非完成状态,调用者可以通过返回的ChannelFuture来获取操作执行的状态,注册监听函数来执行完成后的操作

常用操作

  • isDone:判断当前操作是否完成
  • isSuccess:判断已完成的当前操作是否成功
  • getCause:获取已完成的当前操作失败的原因
  • isCancelled:判断已完成的当前操作是否被取消
  • addListener:注册监听器,当操作已完成(isDone返回完成),将会通知指定的监听器;如果Future已完成,则通知指定的监听器

案例

        NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
        NioEventLoopGroup workerGroup = new NioEventLoopGroup();
        //创建服务器端的启动对象,配置启动参数
        ServerBootstrap bootstrap = new ServerBootstrap();
        //设置
        bootstrap
                .group(bossGroup,workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG,128)
                .childOption(ChannelOption.SO_KEEPALIVE,true)
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    //给pipeline设置处理器
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline()
                                .addLast(new NettyServerHandler());//自定义处理器
                    }
                });
        System.out.println("服务器准备好了...");
        //启动服务器, 绑定端口,并设置同步
        ChannelFuture cf = bootstrap.bind(6668).sync();
        //注册监听器,监控关心的事件
        cf.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture channelFuture) throws Exception {
                if (cf.isSuccess()){
                    System.out.println("监听端口6668成功");
                }else {
                    System.out.println("监听端口6668失败");
                }
            }
        });
        //对关闭通道进行监听
        cf.channel().closeFuture().sync();

        //关闭
        bossGroup.shutdownGracefully();
        workerGroup.shutdownGracefully();

总结

相比传统阻塞io,执行io操作后线程会被阻塞住,直到操作完成;异步处理的好处是不会造成线程阻塞,线程在io操作期间可以执行别的程序,在高并发场景下吞吐量会更高