11-Netty 高性能架构设计-异步模型(ChannelFuture)

异步模型

基本介绍

  1. 异步模型和同步模型相对, 当一个异步过程调用发出后, 调用者不能立刻得到结果, 实际处理这个调用的组件在完成后,通过状态, 通知和回调来通知调用者
  2. Netty中的IO操作是异步的,包括bind, write, Connect等操作会简单的返回一个ChannelFuture
  1. 调用者不能立刻获得结果, 而是通过Future-listener机制, 用户可以方便的主动获取或者通过通知机制获得IO操作结果
  2. Netty的异步模型是建立在future 和 callback之上的, callback就是回调, 重点说Future, 他的核心思想是: 假设一个方法fun, 计算过程可能非常耗时, 等待Fun返回显然不合适, 那么可以再调用Fun的时候,立马写一个Future, 后续可以通过Future去监控方法Fun的处理过程, (即Future-Listener 机制)

Futurn说明

  1. 表示异步的执行结果, 可以通过他提供的方法来检查执行是否完成,比如检索计算等等
  2. ChannelFuture是一个接口: public interface ChannelFuture extends Future<Void> {}
    1. 我们可以添加监听器, 当监听的事件发生时, 就会通知到监听器, 案例说明

工作原理示意图

说明:

  1. 在使用Netty进行编程时拦截操作和转换出入站数据只需要提供callback或者利用future即可, 这使链式操作简单, 高效, 并有利于编写可重用的通用的代码
  2. Netty框架的目标就是让你的业务逻辑从网络基础应用编码中分离出来, 解脱出来

future-listener机制

  1. 当Future对象刚刚创建时, 处于非完成状态, 调用者可以通过返回的ChannelFuture来获取操作执行的状态, 注册监听函数来执行完成后的操作
  2. 常见有如下操作
    1. 通过isDone方法来判断当前操作是否完成
    2. 通过isSuccess方法来判断已完成的当前操作是否成功
    1. 通过getCause方法来获取已完成的当前操作失败的原因
    2. 通过isCancelled方法来判断已完成的当前操作是否被取消
    1. 通过addListener方法注册监听器, 当操作已完成(isDone 方法返回完成), 将会通知指定的监听器, 如果Future对象已完成, 则通知指定的监听器

举例说明

// 绑定一个接口 并且同步 生成一个 ChannelFuture 对象
// 启动服务器(并绑定端口)
ChannelFuture channelFuture = serverBootstrap.bind(6668).sync();

// 给channelFuture注册监听器
channelFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {
        // 如果操作成功
        if (channelFuture.isSuccess()){
            System.out.println("监听端口 6668 成功");
        }else{
            System.out.println("监听端口 6668 失败");
        }
    }
});

执行结果

server is ready......
监听端口 6668 成功
posted @ 2022-01-21 14:38  彼岸舞  阅读(194)  评论(0编辑  收藏  举报