接上篇:Netty学习——源码篇7 Pipeline的事件传播机制
1 Outbound事件传播方式
Outbound事件都是请求事件(Request Event),即请求某件事情的发生,然后通过Outbound事件进行通知。
Outbound事件的传播方向是从Tail到customContext再到Head。下面以Connect事件为例,分析一下Outbound事件的传播机制。
首先,当用户调用了Bootstrap的connect方法时,就会触发一个Connect请求事件,此调用会触发调用链,如下图所示。

继续跟踪,发现AbstractChannel的connect方法又调用了DefaultChannelPipeline的connect 方法,代码如下:
public ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) {
return pipeline.connect(remoteAddress, localAddress, promise);
}
而pipeline.connect()方法的代码如下:
public final ChannelFuture connect(
SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) {
return tail.connect(remoteAddress, localAddress, promise);
}
可以看到,当Outbound事件(这里是Connect事件)传递到Pipeline后,其实是以Tail为起点开始传播的。
而tail.connect调用的是AbstractChannelHandlerContext的connect方法。
public ChannelFuture connect(
final SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise promise) {
if (remoteAddress == null) {
throw new NullPointerException("remoteAddress");
}
if (!validatePromise(promise, false)) {
// cancelled
return promise;
}
final AbstractChannelHandlerContext next = findContextOutbound();
EventExecutor executor = next.executor();
if (executor.inEventLoop()) {
next.invokeConnect(remoteAddress, localAddress, promise);
} else {
safeExecute(executor, new Runnable() {
@Override
public void run() {
next.invokeConnect(remoteAddress, localAddress, promise);
}
}, promise, null);
}
return promise;
}
顾名思义,findContextOutbound 方法的作用是以当前Context为起点,向Pipeline中Context双向链表的前段寻找第一个Outbound属性为true的Context(即关

最低0.47元/天 解锁文章
1788

被折叠的 条评论
为什么被折叠?



