《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add

当向pipeline中添加handler时可以从头部添加addFirst,可以添加到某个handler的前面addBefore,可以添加到指定handler的后面addAfter,当然也可以添加到链表的末尾addLast,本文分析addLast,源码过程如下:

《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第1张图片

接下来逐一分析过程中的方法。

filterName

该方法主要是防止向pipeline中添加相同name的handler。

《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第2张图片

newContext

将handler包装成handlerContext

《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第3张图片

addLast0

将handlerContext添加到pipeline链表的末尾

《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第4张图片

callHandlerCallbackLater

如果channel还没注册则将handler添加到pendingHandlerCallbackHead中,当channel注册成功后可以让这些handler调用handlerAdded方法,也就是异步完成handler添加成功事件。

《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第5张图片

callHandlerAddedInEventLoop

如果当前线程不是在eventloop中执行则异步调用callHandlerAdded0方法
《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第6张图片

callHandlerAdded0

调用handler的handlerAdded方法。
《Netty》从零开始学netty源码(二十七)之ChannelPipeline.add_第7张图片

至此,DefaultChannelPipeline的addLast方法至此分析完毕。当向pipeline中添加handler时先将handler包装成context再添加,添加成功后会调用handler的handlerAdded方法,如果此时channel还没注册则等注册成功后再调用,如果不是在eventloop线程中执行则向eventloop中添加任务异步执行。

你可能感兴趣的:(Netty,netty)