Operación de desconexión de Netty Channel (5)

El SocketChannel NIO nativo de Java no existe. Cuando se llama a la desconexión (promesa de ChannelPromise) de Netty NioSocketChannel, se convertirá automáticamente en una operación de cierre.
Entonces, el método de desconexión (promesa de ChannelPromise) en Channel está diseñado por Netty para UDP.

Mediante el método desconectar () en NioSocketChannel, la aplicación puede cerrar activamente el canal NioSocketChannel. NioSocketChannel hereda la clase abstracta AbstractChannel, por lo que el método desconectar () es en realidad una implementación AbstractChannel; dentro del método, se llamará al método desconectar () en el ChannelPipeline correspondiente para desconectar El evento se propaga en la tubería.

@Override
public ChannelFuture disconnect() {
    return pipeline.disconnect();
}

DefaultChannelPipeline 中 desconectar () 方法 :

@Override
public final ChannelPipeline disconnect() {
    tail.disconnect();
    return this;
}

Llame al método disconnect () de TailContext para propagar el evento flush en la tubería desde el nodo de cola al nodo principal. La implementación de TailContext del método flush () se hereda de la clase abstracta AbstractChannelHandlerContext. El código es el siguiente:

@Override
public ChannelFuture disconnect() {
    return disconnect(newPromise());
}

@Override
public ChannelFuture disconnect(final ChannelPromise promise) {
    // 判断是否为合法的 Promise 对象
    if (isNotValidPromise(promise, false)) {
        // cancelled
        return promise;
    }

    final AbstractChannelHandlerContext next = findContextOutbound();
    EventExecutor executor = next.executor();
    if (executor.inEventLoop()) {
        // <1> 如果没有 disconnect 操作,则执行 close 事件在 pipeline 上
        // Translate disconnect to close if the channel has no notion of disconnect-reconnect.
        // So far, UDP/IP is the only transport that has such behavior.
        if (!channel().metadata().hasDisconnect()) {
            next.invokeClose(promise);
        // 如果有 disconnect 操作,则执行 disconnect 事件在 pipeline 上
        } else {
            next.invokeDisconnect(promise);
        }
    } else {
        safeExecute(executor, new Runnable() {
            @Override
            public void run() {
                // hasDisconnect() 方法,判断 Channel 是否支持 disconnect 操作,如果没有 disconnect 操作,则执行 close 事件在 pipeline 上
                if (!channel().metadata().hasDisconnect()) {
                    next.invokeClose(promise);
                    // 如果有 disconnect 操作,则执行 disconnect 事件在 pipeline 上
                } else {
                    next.invokeDisconnect(promise);
                }
            }
        }, promise, null);
    }
    return promise;
}

Oye, ya casi termina.

Publicado 46 artículos originales · ganado elogios 6 · vistas 3847

Supongo que te gusta

Origin blog.csdn.net/weixin_43257196/article/details/104928779
Recomendado
Clasificación