Netty的核心组件

  Channel

  回调

  Future

  事件

  ChannelHandler

  这些模块代表了不同的类型:资源(事件)、逻辑(ChannelHandler中包含各种处理逻辑)、通知(回调、Channel、Future)。应用程序通过这几个模块之间的组合就可以实现数据的流通

Channel

  通道,是 java NIO 的一个基本构造。可以把它看作是传入(入站)或者传出(出站)数据的载体。也就是说数据的流通得经过它。

回调

  一种通知的方式。可以简单的理解为:张三找李四出去打球,但是这时李四有事,于是张三留了自己的电话号码(引用)给李四,告诉他做完了事情打电话通知我。不久之后,李四把手中的事情处理完毕了,于是打了电话给张三说道:我的事情处理完了,我们去打球吧!!!如上就是一个回调的过程。

Future

  提供了一种在操作完成时通知应用程序的机制。其实本质上就是回调。Java jdk提供了Future的实现,只是需要手动的检查操作是否已经完成了,或者一直阻塞知道完成为止,比较繁琐且效率低。所以Netty提供了ChannelFuture,用于执行异步操作的时候使用。

  ChannelFuture 提供了几个额外的方法,这些方法使得我们能够注册一个或者多个 ChannelFutureListener 实例。例如监听器的 回调方法:operationComplete(),将会在对应的操作完成时被调用(注意:如果在 ChannelFutureListener 添加到 ChannelFutre 的时候,ChannelFuture应完成了,那么该 ChannelFutureListener 将会被直接地通知到)。

....    
ChannelFuture cf = bs.connect(host, port).sync(); //添加一个监听,当连接成功后,发送数据 cf.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if(future.isSuccess()){ ChannelFuture sendMsg = cf.channel().writeAndFlush("I am client"); }else{ Throwable cause = future.cause(); cause.printStackTrace(); } } });
...

  ChannelFutureListener 实际上是回调的一个更加精细的版本。事实上,回调和 Future 是相互补充的机制;他们相互结合,构成 Netty 本身的关键构建快之一

 

问题:

  回调和 Future 是相互补充的机制?