netty的ChannelPromise类学习

文章目录

      • 1、Future(JUC )
      • 2、Future( Netty异步结果)
      • 3、ChannelFuture
      • 4、Promise(异步执行)
      • 5、ChannelPromise

1、Future(JUC )

​ Future是java 1.5引入的一个interface,可以方便的用于异步结果的获取,它代表异步调用的结果,使用它我们可以在进行异步调用后 去做其他的事情。

​ 应用场景:1. 耗时的操作,2. 远程方法调用。

方法 描述
isDone() 判断异步请求是否完成
get() 获取异步结果
get(long timeout, TimeUnit unit) 获取异步结果 如果没有完成一直阻塞,同时也提供了设置超时时间的等待
cancel(boolean mayInterruptIfRunning) 异步请求取消 传入一个boolean参数,来选择是否中断正在运行的task
isCancelled() 查看请求是否取消
@Test
public void testFuture() throws Exception{
     
    ExecutorService executors = new ThreadPoolExecutor(1,1,
                  100,TimeUnit.MILLISECONDS,
                  new SynchronousQueue());
    //获取异步结果
    Future<Integer> future = executors.submit(new CalculateTask(10));
    //1、判断是否完成
    boolean done = future.isDone();
    System.out.println("请求是否已经完成:"+done);
    //2、获取异步结果 如果没有完成一直阻塞,同时也提供了设置超时时间的等待
    //Integer result = future.get();
    Integer result = future.get(100, TimeUnit.MILLISECONDS);
    System.out.println("请求结果:"+result);
    //3、异步请求取消 传入一个boolean参数,来选择是否中断正在运行的task
    future.cancel(true);
    //4、查看异步请求是否取消
    boolean cancelled = future.isCancelled();
    while(!cancelled){
     
        System.out.println("请求正在取消");
        cancelled = future.isCancelled();
    }
    System.out.println("请求已取消");
}

2、Future( Netty异步结果)

netty中的Future接口继承了JUC中的Future,同时扩展了isSuccess()成功、cause()异常、sync()同步、await()等待、以及添加监听器GenericFutureListener让我们可以响应式的实时监听对应的异步处理结果,不必使用get阻塞等待结果。

​ future其中最重要的功能应该是提供了注册事件监听的形式帮我们更好的监听异步处理结果。其中的监听器为GenericFutureListener它提供了一个函数式接口operationComplete(),我们在该方法中可以进行异步处理结果(请求成功、请求失败、请求异常)并针对不同处理结果做相应操作。通过GenericFutureListener接口的子类ChannelFutureListener 提供了三个类型的事件监听 方便我们使用。

  //CLOSE:关闭channel
  ChannelFutureListener CLOSE = new ChannelFutureListener() {
     
        @Override
        public void operationComplete(ChannelFuture future) {
     
            future.channel().close();
        }
    };

  //CLOSE_ON_FAILURE :异步请求失败关闭channel
  ChannelFutureListener CLOSE_ON_FAILURE = new ChannelFutureListener() {
     
        @Override
        public void operationComplete(ChannelFuture future) {
     
            if (!future.isSuccess()) {
     
                future.channel().close();
            }
        }
   };

  //FIRE_EXCEPTION_ON_FAILURE:异步请求失败关闭channel
  ChannelFutureListener FIRE_EXCEPTION_ON_FAILURE = new ChannelFutureListener() {
     
       @Override
       public void operationComplete(ChannelFuture future) {
     
           if (!future.isSuccess()) {
     
               future.channel().pipeline().fireExceptionCaught(future.cause());
           }
       }
   };

3、ChannelFuture

ChannelFuture 接口扩展了 Netty 的 Future 接口,表示一种没有返回值的异步调用,同时和一个 Channel 进行绑定。

4、Promise(异步执行)

Promise 接口继承了 Future 接口,它将所有方法返回Future的都转换为Promise,同时它可以设置异步执行的结果。

5、ChannelPromise

ChannelPromise 接口扩展了 Promise 和 ChannelFuture,绑定了 Channel,既设置异步执行结果同时又具备了监听处理结果的功能,是 Netty 实际编程使用的表示异步执行的接口。其实现类为DefaultChannelPromise。

你可能感兴趣的:(netty源码分析,java)