ChannelHandler的添加
ChannelHandler
的添加在DefaultChannelPipeline#addLast
方法里
public final ChannelPipeline addLast(ChannelHandler... handlers) {
return addLast(null, handlers);
}
public final ChannelPipeline addLast(EventExecutorGroup executor, ChannelHandler... handlers) {
ObjectUtil.checkNotNull(handlers, "handlers");
for (ChannelHandler h: handlers) {
if (h == null) {
break;
}
addLast(executor, null, h);
}
return this;
}
复制代码
可以看到,这个函数能添加多个handler,继续跟进
public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) {
final AbstractChannelHandlerContext newCtx;
synchronized (this) {
//检查handler是否被重复添加
checkMultiplicity(handler);
//创建节点
newCtx = newContext(group, filterName(name, handler), handler);
//将节点添加到链表
addLast0(newCtx);
//省略部分代码
EventExecutor executor = newCtx.executor();
if (!executor.inEventLoop()) {
//若不在当前eventLoop,把回调添加完成事件这个任务添加到异步任务队列
callHandlerAddedInEventLoop(newCtx, executor);
return this;
}
}
//回调添加完成事件
callHandlerAdded0(newCtx);
return this;
}
复制代码
概括一下,添加ChannelHandler主要做了三件事
-
判断是否重复添加
-
创建节点并添加至链表
-
回调添加完成事件
判断是否重复添加
来看看checkMultiplicity
这个函数
private static void checkMultiplicity(ChannelHandler handler) {
if (handler instanceof ChannelHandlerAdapter) {
ChannelHandlerAdapter h = (ChannelHandlerAdapter) handler;
if (!h.isSh