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源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java解决No enclosing instance of type PrintListFromTailToHead is accessible问题的两种方案

    Java解决No enclosing instance of type PrintListFromTailToHead

    这篇文章主要介绍了Java解决No enclosing instance of type PrintListFromTailToHead is accessible问题的两种方案的相关资料,需要的朋友可以参考下
    2016-07-07
  • Spring Boot实现微信扫码登录功能流程分析

    Spring Boot实现微信扫码登录功能流程分析

    这篇文章主要介绍了Spring Boot 实现微信扫码登录功能,介绍了授权流程代码和用户登录和登出的操作代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Java中用户线程与守护线程的使用区别

    Java中用户线程与守护线程的使用区别

    这篇文章主要介绍了Java中用户线程与守护线程的使用区别,Java语言中无论是线程还是线程池,默认都是用户线程,因此用户线程也被成为普通线程,下文关于其与守护线程的区别详情,需要的小伙伴可以参考一下
    2022-05-05
  • 支撑Java NIO与NodeJS的底层技术

    支撑Java NIO与NodeJS的底层技术

    这篇文章主要为大家详细介绍了支撑Java NIO与NodeJS的底层技术,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • SpringBoot中的@PreAuthorize注解详解

    SpringBoot中的@PreAuthorize注解详解

    这篇文章主要介绍了SpringBoot中的@PreAuthorize注解详解,@PreAuthorize注解会在方法执行前进行权限验证,支持Spring EL表达式,它是基于方法注解的权限解决方案,需要的朋友可以参考下
    2023-09-09
  • 详解java.lang.NumberFormatException错误及解决办法

    详解java.lang.NumberFormatException错误及解决办法

    这篇文章主要介绍了详解java.lang.NumberFormatException错误及解决办法,本文详解的介绍了错误的解决方法,感兴趣的可以一起来了解一下
    2020-05-05
  • java二叉树的遍历方式详解

    java二叉树的遍历方式详解

    这篇文章主要为大家详细介绍了java实现二叉树遍历的四种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • Java三大特性之多态详解

    Java三大特性之多态详解

    多态是继封装、继承之后,面向对象的第三大特性。多态: 是指同一行为,具有多个不同表现形式。本文将来和大家详细说说Java中的多态,需要的可以了解一下
    2022-10-10
  • Java8中Map常用的遍历方式

    Java8中Map常用的遍历方式

    这篇文章主要给大家介绍了关于Java8中Map常用的遍历方式,map属于java中的顶级接口之一,区别于list,map是键值对的形式存在,需要的朋友可以参考下
    2023-07-07
  • Java中接口Set的特点及方法说明

    Java中接口Set的特点及方法说明

    这篇文章主要介绍了Java中接口Set的特点及方法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论