1.AbstractBootstrap
private static void doBind0(final ChannelFuture regFuture, final Channel channel, final SocketAddress localAddress, final ChannelPromise promise) {
channel.eventLoop().execute(new Runnable() {
public void run() {
if (regFuture.isSuccess()) {
channel.bind(localAddress,
// 此处加了监听器
promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
} else {
promise.setFailure(regFuture.cause());
}
}
});
}
2. AbstractChannel.AbstractUnsafe
public final void bind(SocketAddress localAddress, ChannelPromise promise) {
....
// 此处调用了
this.safeSetSuccess(promise);
}
}
3.AbstractChannel
protected final void safeSetSuccess(ChannelPromise promise) {
// trySuccess
if (!(promise instanceof VoidChannelPromise) && !promise.trySuccess()) {
AbstractChannel.logger.warn("Failed to mark a promise as success because it is done already: {}", promise);
}
}
DefaultChannelPromise
public boolean trySuccess() {
return this.trySuccess((Object)null);
}
DefaultPromise
public boolean trySuccess(V result) {
if (this.setSuccess0(result)) {
this.notifyListeners();
return true;
} else {
return false;
}
}
private void notifyListeners() {
EventExecutor executor = this.executor();
if (executor.inEventLoop()) {
InternalThreadLocalMap threadLocals = InternalThreadLocalMap.get();
int stackDepth = threadLocals.futureListenerStackDepth();
if (stackDepth < MAX_LISTENER_STACK_DEPTH) {
threadLocals.setFutureListenerStackDepth(stackDepth + 1);
try {
// 这里
this.notifyListenersNow();
} finally {
threadLocals.setFutureListenerStackDepth(stackDepth);
}
return;
}
}
safeExecute(executor, new Runnable() {
public void run() {
DefaultPromise.this.notifyListenersNow();
}
});
}
// 再一路
private static void notifyListener0(Future future, GenericFutureListener l) {
try {
// 最终就是这个,最后调用了事件
l.operationComplete(future);
} catch (Throwable var3) {
logger.warn("An exception was thrown by " + l.getClass().getName() + ".operationComplete()", var3);
}
}
网友评论