Netty进阶之ChannelPoolMap源码解析

 更新时间:2023年11月16日 09:32:54   作者:立小研先森  
这篇文章主要介绍了Netty进阶之ChannelPoolMap源码解析,ChannelPoolMap是用来存储ChannelPool和指定key的一个集合Map,实际的应用场景就是服务器端是一个分布式集群服务,拥有多个配置地址,这样我们就可以配置多个服务地址,减轻单台服务器的压力,需要的朋友可以参考下

前言

ChannelPoolMap是用来存储ChannelPool和指定key的一个集合Map,实际的应用场景就是服务器端是一个分布式集群服务,拥有多个配置地址,这样我们就可以配置多个服务地址,减轻单台服务器的压力;Netty框架提供了ChannelPoolMap接口和AbstractChannelPoolMap抽象方法。

一、ChannelPoolMap接口源码分析

package io.netty.channel.pool;

/**
 * Allows to map {@link ChannelPool} implementations to a specific key.
 *
 * @param <K> the type of the key
 * @param <P> the type of the {@link ChannelPool}
 */
public interface ChannelPoolMap<K, P extends ChannelPool> {
    /**
     * Return the {@link ChannelPool} for the {@code code}. This will never return {@code null},
     * but create a new {@link ChannelPool} if non exists for they requested {@code key}.
     *
     * Please note that {@code null} keys are not allowed.
     */
    P get(K key);

    /**
     * Returns {@code true} if a {@link ChannelPool} exists for the given {@code key}.
     *
     * Please note that {@code null} keys are not allowed.
     */
    boolean contains(K key);
}

接口提供了两个方法,get方法用于获取指定key对应的ChannelPool,contains方法用来判定Map集合中是否存在指定key对应的ChannelPool。

二、AbstractChannelPoolMap抽象实现类

1.get方法分析

    private final ConcurrentMap<K, P> map = PlatformDependent.newConcurrentHashMap();

    @Override
    public final P get(K key) {
      //获取ChannelPool
        P pool = map.get(checkNotNull(key, "key"));
        if (pool == null) {
          //创建一个新的ChannelPool
            pool = newPool(key);
          //如果集合中存在ChannelPool,则返回老的ChannelPool对象
            P old = map.putIfAbsent(key, pool);
           //若果老的ChannelPool真实存在
            if (old != null) {
               //异步销毁新创建的ChannelPool
                // We need to destroy the newly created pool as we not use it.
                poolCloseAsyncIfSupported(pool);
                pool = old;
            }
        }
        return pool;
    }
  • 定义了一个ConcurrentMap类型的map类变量,用来存放key及其对应的ChannelPool;
  • 首先会从集合中获取ChannelPool,如果不存在则创建一个新的ChannelPool;
    /**
     * Called once a new {@link ChannelPool} needs to be created as non exists yet for the {@code key}.
     */
    protected abstract P newPool(K key);

newPool方法是一个抽象方法,需要用户自己实现ChannelPool的创建操作;

    /**
     * If the pool implementation supports asynchronous close, then use it to avoid a blocking close call in case
     * the ChannelPoolMap operations are called from an EventLoop.
     *
     * @param pool the ChannelPool to be closed
     */
    private static Future<Void> poolCloseAsyncIfSupported(ChannelPool pool) {
        if (pool instanceof SimpleChannelPool) {
            return ((SimpleChannelPool) pool).closeAsync();
        } else {
            try {
                pool.close();
                return GlobalEventExecutor.INSTANCE.newSucceededFuture(null);
            } catch (Exception e) {
                return GlobalEventExecutor.INSTANCE.newFailedFuture(e);
            }
        }
    }

异步关闭ChannelPool,如果是SimpleChannelPool的实现,则调用异步方法closeAsync;如果是其它实现,则调用close方法。

2.remove方法分析

    public final boolean remove(K key) {
      //移除指定key的ChannelPool
        P pool =  map.remove(checkNotNull(key, "key"));
        if (pool != null) {
          //如果移除成功,则异步的关闭ChannelPool,避免阻塞方法
            poolCloseAsyncIfSupported(pool);
            return true;
        }
        return false;
    }

到此这篇关于Netty进阶之ChannelPoolMap源码解析的文章就介绍到这了,更多相关ChannelPoolMap源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot启动自动终止也不报错的原因及解决

    SpringBoot启动自动终止也不报错的原因及解决

    这篇文章主要介绍了SpringBoot启动自动终止也不报错的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java创建多线程异步执行实现代码解析

    Java创建多线程异步执行实现代码解析

    这篇文章主要介绍了Java创建多线程异步执行实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot实现发送邮件功能过程图解

    SpringBoot实现发送邮件功能过程图解

    这篇文章主要介绍了SpringBoot实现发送邮件功能过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java8如何基于flatMap处理异常函数

    Java8如何基于flatMap处理异常函数

    这篇文章主要介绍了Java8如何基于flatMap处理异常函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java数字转中文大写工具类详细代码(拿去即用)

    Java数字转中文大写工具类详细代码(拿去即用)

    最近项目中用到金额转大写的地方,索性给大家总结下,这篇文章主要给大家介绍了关于Java数字转中文大写工具类的相关资料,文中给出了详细的代码示例,需要的朋友可以参考下
    2024-05-05
  • Spring中@Transactional注解关键属性和用法小结

    Spring中@Transactional注解关键属性和用法小结

    在Spring框架中,@Transactional 是一个注解,用于声明事务性的方法,它提供了一种声明式的事务管理方式,避免了在代码中直接编写事务管理相关的代码,本文给大家介绍@Transactional 注解的一些关键属性和用法,感兴趣的朋友一起看看吧
    2023-12-12
  • Springboot中配置Mail和普通mail的实现方式

    Springboot中配置Mail和普通mail的实现方式

    这篇文章主要介绍了Springboot中配置Mail和普通mail的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • java实现三角形分形山脉

    java实现三角形分形山脉

    这篇文章主要为大家详细介绍了java实现三角形分形山脉,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • SpringBoot搭建go-cqhttp机器人的方法实现

    SpringBoot搭建go-cqhttp机器人的方法实现

    本文主要介绍了SpringBoot搭建go-cqhttp机器人的方法实现
    2021-12-12
  • 又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多难用

    又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多难用

    网络数据的基本单位永远是byte,Java NIO提供ByteBuffer作为字节的容器,但该类过于复杂,有点难用.本篇文章就带大家简单了解一下 ,需要的朋友可以参考下
    2021-06-06

最新评论