DefaultChannelPromise
在分析Unsafe或者ChannelPipeline的方法时经常出现Promise类,它用来保存channel的状态值,默认使用的是DefaultChannelPromise,接下来分析这个类。
类结构图
属性值
DefaultChannelPromise中有一个属性result
,它用来保存channel的状态值,通过AtomicReferenceFieldUpdater类型的RESULT_UPDATER来进行原子更新result值,它的值一般有null、SUCCESS、UNCANCELLABLE。
当result值变化时会触发监听器。
接下来我们以最常用的方法trySuccess
来分析DefaultChannelPromise的使用方法及用途。
trySuccess
trySuccess
的源码过程如下:
接下来分析checkNotifyWaiters
和notifyListeners
方法。
checkNotifyWaiters方法
如果有waiters则进行唤醒
notifyListeners方法
在netty中很多操作都是异步的,所以会多次多处调用notifyListeners
方法,为了防止无止境的循环调用对触发监听器的逻辑进行了栈深度保护策略,默认最大深度为8,可通过参数修改。注意,这里是要在同一个线程才有意义,所以需要判断是否inEventLoop。
notifyListenersNow方法
如果有多个listeners则逐个触发监听器listener
如果只有一个listener则调用监听器的operationComplete
方法进行相应的处理。
至此,netty的DefaultChannelPromise分析至此完毕。