Netty中ChannelPoolHandler调用处理程序详解

 更新时间:2023年11月16日 09:11:15   作者:立小研先森  
这篇文章主要介绍了Netty中ChannelPoolHandler调用处理程序详解,Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API,需要的朋友可以参考下

ChannelPoolHandler调用处理程序

一、ChannelPoolHandler源码解析

public interface ChannelPoolHandler {
    /**
     * Channel信道被ChannelPool#release(Channel)或ChannelPool#release(Channel, Promise)方法
     * 调用,并释放会ChannelPool连接池,
     */
    void channelReleased(Channel ch) throws Exception;

    /**
     * Channel信道通过调用ChannelPool#acquire()或ChannelPool#acquire(Promise)方法获取
     */
    void channelAcquired(Channel ch) throws Exception;

    /**
     * 在ChannelPool中创建Channel时将会被调用一次
     */
    void channelCreated(Channel ch) throws Exception;
}

二、AbstractChannelPoolHandler源码解析

public abstract class AbstractChannelPoolHandler implements ChannelPoolHandler {

    /**
     * 无操作实现方法,可以被子类覆盖
     *
     */
    @Override
    public void channelAcquired(@SuppressWarnings("unused") Channel ch) throws Exception {
        // NOOP
    }

    /**
     * 无操作实现方法,可以被子类覆盖
     */
    @Override
    public void channelReleased(@SuppressWarnings("unused") Channel ch) throws Exception {
        // NOOP
    }
}

AbstractChannelPoolHandler抽象类是ChannelPoolHandler的框架实现类,其实现了两个无任何操作的方法。

三、调用channelCreated方法

SimpleChannelPool#SimpleChannelPool构造函数中调用channelCreated方法

 public SimpleChannelPool(Bootstrap bootstrap, final ChannelPoolHandler handler, ChannelHealthChecker healthCheck,
                             boolean releaseHealthCheck, boolean lastRecentUsed) {
        this.handler = checkNotNull(handler, "handler");
        this.healthCheck = checkNotNull(healthCheck, "healthCheck");
        this.releaseHealthCheck = releaseHealthCheck;
        // Clone the original Bootstrap as we want to set our own handler
        this.bootstrap = checkNotNull(bootstrap, "bootstrap").clone();
        this.bootstrap.handler(new ChannelInitializer<Channel>() {
            @Override
            protected void initChannel(Channel ch) throws Exception {
                assert ch.eventLoop().inEventLoop();
               //此处调用ChannelPoolHandler处理程序的创建Channel信道方法
                handler.channelCreated(ch);
            }
        });
        this.lastRecentUsed = lastRecentUsed;
    }

四、获取Channel信道方法

SimpleChannelPool#notifyConnect方法中调用channelAcquired获取Channel信道方法

    private void notifyConnect(ChannelFuture future, Promise<Channel> promise) {
        Channel channel = null;
        try {
            if (future.isSuccess()) {
                channel = future.channel();
              //调用获取Channel信道方法
                handler.channelAcquired(channel);
                if (!promise.trySuccess(channel)) {
                    // Promise was completed in the meantime (like cancelled), just release the channel again
                    release(channel);
                }
            } else {
                promise.tryFailure(future.cause());
            }
        } catch (Throwable cause) {
            closeAndFail(channel, cause, promise);
        }
    }

五、释放Channel信道方法

SimpleChannelPool#releaseAndOffer和SimpleChannelPool#releaseAndOffer调用channelReleased释放Channel信道方法

    private void releaseAndOfferIfHealthy(Channel channel, Promise<Void> promise, Future<Boolean> future) {
        try {
            if (future.getNow()) { //channel turns out to be healthy, offering and releasing it.
                releaseAndOffer(channel, promise);
            } else { //channel not healthy, just releasing it.
                handler.channelReleased(channel);
                promise.setSuccess(null);
            }
        } catch (Throwable cause) {
            closeAndFail(channel, cause, promise);
        }
    }

    private void releaseAndOffer(Channel channel, Promise<Void> promise) throws Exception {
        if (offerChannel(channel)) {
            handler.channelReleased(channel);
            promise.setSuccess(null);
        } else {
            closeAndFail(channel, new ChannelPoolFullException(), promise);
        }
    }

到此这篇关于Netty中ChannelPoolHandler调用处理程序详解的文章就介绍到这了,更多相关ChannelPoolHandler调用处理程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Scanner类用法及nextLine()产生的换行符问题实例分析

    Java Scanner类用法及nextLine()产生的换行符问题实例分析

    这篇文章主要介绍了Java Scanner类用法及nextLine()产生的换行符问题,结合实例形式分析了Scanner类功能、hasNextInt()和nextInt()方法使用及nextLine()产生的换行符问题解决方法,需要的朋友可以参考下
    2019-03-03
  • 使用Java第三方实现发送短信功能

    使用Java第三方实现发送短信功能

    这篇文章主要介绍了使用Java第三方实现发送短信功能,在一些开发中,经常需要有给用户发送短信接收验证码的功能,那么在Java中该如何实现呢,今天我们就一起来看一看
    2023-03-03
  • JAVAEE项目结构以及并发随想

    JAVAEE项目结构以及并发随想

    每个代码里面的工具都是工具,API是你最需要理解的,哪个好,哪个不好,没有准确答案。 一切皆对象,对于Java来讲是纯粹的,代理是对象,反射是对象,对象是对象,基本数据类型不是对象。
    2016-04-04
  • Java Swing中JTable渲染器与编辑器用法示例

    Java Swing中JTable渲染器与编辑器用法示例

    这篇文章主要介绍了Java Swing中JTable渲染器与编辑器用法,结合实例形式较为详细的分析了Swing中JTable渲染器与编辑器的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-11-11
  • java Nio使用NioSocket客户端与服务端交互实现方式

    java Nio使用NioSocket客户端与服务端交互实现方式

    这篇文章主要介绍了java Nio使用 NioSocket 客户端与服务端交互实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • JDBC中PreparedStatement详解以及应用场景实例介绍

    JDBC中PreparedStatement详解以及应用场景实例介绍

    PreparedStatement对象代表的是一个预编译的SQL语句,用它提供的setter方法可以传入查询的变量,这篇文章主要给大家介绍了关于JDBC中PreparedStatement详解以及应用场景实例介绍的相关资料,需要的朋友可以参考下
    2024-02-02
  • Java设计模式之责任链模式的示例详解

    Java设计模式之责任链模式的示例详解

    责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象。本文将通过示例和大家详细聊聊责任链模式,需要的可以参考一下
    2022-11-11
  • 关于logBack配置日志文件及编码配置的问题

    关于logBack配置日志文件及编码配置的问题

    这篇文章主要介绍了logBack配置日志文件及编码配置的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java 文件传输助手的实现(单机版)

    Java 文件传输助手的实现(单机版)

    这篇文章主要介绍了Java 文件传输助手的实现(单机版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Maven编译错误:程序包com.sun.*包不存在的三种解决方案

    Maven编译错误:程序包com.sun.*包不存在的三种解决方案

    J2SE中的类大致可以划分为以下的各个包:java.*,javax.*,org.*,sun.*,本文文章主要介绍了maven编译错误:程序包com.sun.xml.internal.ws.spi不存在的解决方案,感兴趣的可以了解一下
    2024-02-02

最新评论