Netty进阶《ChannelPoolMap源码分析》

article/2023/6/3 16:50:15

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();@Overridepublic final P get(K key) {//获取ChannelPoolP pool = map.get(checkNotNull(key, "key"));if (pool == null) {//创建一个新的ChannelPoolpool = 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的ChannelPoolP pool =  map.remove(checkNotNull(key, "key"));if (pool != null) {//如果移除成功,则异步的关闭ChannelPool,避免阻塞方法poolCloseAsyncIfSupported(pool);return true;}return false;}

源码参考:https://github.com/mingyang66/SkyDb

GitHub地址:https://github.com/mingyang66/spring-parent

http://www.ngui.cc/article/show-1007541.html

相关文章

从零开始学习目标检测:YOLO算法详解

从零开始学习目标检测&#xff1a;YOLO算法详解 文章目录从零开始学习目标检测&#xff1a;YOLO算法详解1. &#x1f31f;什么是目标检测?2.&#x1f31f;传统的目标检测与基于深度学习的目标检测3.&#x1f31f;目标检测算法的工作流程4.&#x1f31f;目标检测可以干什么&…

【华为OD机试 2023最新 】 最优资源分配(C++)

文章目录 题目描述输入描述输出描述备注用例题目解析C++题目描述 某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为 1.25 * 1 = 1.25G配置B:占用容量为 1.25 * 2 = 2.5G配置C…

车机娱乐系统

BYD哪吒理想蔚来小鹏埃安吉利(魅族)大众 MQB大众MEB奥迪娱乐主机内置TboxYes生产商惠州比亚迪电子有限公司惠州市德赛西威汽车电子股份有限公司惠州市德赛西威汽车电子股份有限公司伟创力电脑&#xff08;苏州&#xff09;有限公司比亚迪汽车工业有限公司铁将军汽车电子股份有限…

数据结构与算法二 算法分析

一 算法分析 前面我们已经介绍了&#xff0c;研究算法的最终目的就是如何花更少的时间&#xff0c;如何占用更少的内存去完成相同的需求&#xff0c;并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异&#xff0c;但我们并不能将时间占用和空间占用量化&#xff0c…

【kuangbin计划】简单DP(1-3题 java/c++双语言详细解析)

本意是同时提供java以及c两种语言的代码的题解 但是无奈oj网站一直欺负java语言慢&#xff0c; 因此本篇题解部分java代码只提供思路参考 不提供语言优化&#xff0c;有兴趣的同学可以自行优化java版本 过不了的java语言均已注明&#xff01; 目录 4546. 最大和加强加强版 - 线…

双重检查锁定与延迟优化

双重检查锁定与延迟优化1. 双重所检查的由来2. 问题根源3. 基于volatile的解决方案4. 基于类初始化的解决方案在Java多线程程序中&#xff0c;有时需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术&#xff0c;但它是一个错误的用法。本…

STM32-9 STM32CubeMX的使用方法

一、 说明 本项目是基于FreeRTOS项目的STM32CubeMX开发方式&#xff0c;说明了具体配置与相关参数&#xff0c;以及mdk使用&#xff0c;裸机也可以参考本配置。 二、项目建立步骤 1、新建项目 2、选择芯片型号 3、配置时钟 RCC 设置&#xff0c;选择 HSE(外部高速时钟) 和L…

Baumer工业相机堡盟相机在BGAPI SDK中如何实现Bitmap的复制克隆(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

Go map 内存泄露

前言 在Go中, map这个结构使用的频率还是比较高的. 其实在所有的语言中, map使用的频率都是很高的. 之前在使用中, 一直都知道map的内存在元素删除的时候不会回收, 但一直没有仔细的研究为什么. 今天就来好好揣摩揣摩. func main() {m : make(map[int][128]byte)for i : 0; …

Python参数类型定义、私有函数与变量、全局变量

函数的参数类型定义 参数名 冒号 类型函数函数定义在Python3.7之后可用函数不会对参数类型进行验证 def add(a:int, b:int3):print(a b)add(1, 2) add(hello, xiaomu)def test(a:int, b:int3, *args:int, **kwargs):print(a, b, args, kwargs)test(1, 2, 3, 4, namexiaomu)…