Netty進階之ChannelPoolMap源碼解析
前言
ChannelPoolMap是用來存儲ChannelPool和指定key的一個集合Map,實際的應(yīng)用場景就是服務(wù)器端是一個分布式集群服務(wù),擁有多個配置地址,這樣我們就可以配置多個服務(wù)地址,減輕單臺服務(wù)器的壓力;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對應(yīng)的ChannelPool,contains方法用來判定Map集合中是否存在指定key對應(yīng)的ChannelPool。
二、AbstractChannelPoolMap抽象實現(xiàn)類
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) {
//創(chuàng)建一個新的ChannelPool
pool = newPool(key);
//如果集合中存在ChannelPool,則返回老的ChannelPool對象
P old = map.putIfAbsent(key, pool);
//若果老的ChannelPool真實存在
if (old != null) {
//異步銷毀新創(chuàng)建的ChannelPool
// We need to destroy the newly created pool as we not use it.
poolCloseAsyncIfSupported(pool);
pool = old;
}
}
return pool;
}
- 定義了一個ConcurrentMap類型的map類變量,用來存放key及其對應(yīng)的ChannelPool;
- 首先會從集合中獲取ChannelPool,如果不存在則創(chuàng)建一個新的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方法是一個抽象方法,需要用戶自己實現(xiàn)ChannelPool的創(chuàng)建操作;
/**
* 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);
}
}
}
異步關(guān)閉ChannelPool,如果是SimpleChannelPool的實現(xiàn),則調(diào)用異步方法closeAsync;如果是其它實現(xiàn),則調(diào)用close方法。
2.remove方法分析
public final boolean remove(K key) {
//移除指定key的ChannelPool
P pool = map.remove(checkNotNull(key, "key"));
if (pool != null) {
//如果移除成功,則異步的關(guān)閉ChannelPool,避免阻塞方法
poolCloseAsyncIfSupported(pool);
return true;
}
return false;
}
到此這篇關(guān)于Netty進階之ChannelPoolMap源碼解析的文章就介紹到這了,更多相關(guān)ChannelPoolMap源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)獲取指定個數(shù)的不同隨機數(shù)
今天小編就為大家分享一篇關(guān)于Java實現(xiàn)獲取指定個數(shù)的不同隨機數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
SpringBoot整合liquibase及l(fā)iquibase生成初始化腳本的方式
這篇文章主要介紹了SpringBoot整合liquibase的相關(guān)資料,文中給大家介紹了liquibase生成初始化腳本的兩種方式,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
java并發(fā)編程JUC CountDownLatch線程同步
這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來展開對java并發(fā)編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內(nèi)容2021-09-09
java中靜態(tài)變量和實例變量的區(qū)別詳細介紹
本篇文章介紹了,java中靜態(tài)變量和實例變量的區(qū)別。需要的朋友參考下2013-05-05
openFeign服務(wù)之間調(diào)用保持請求頭信息處理方式
這篇文章主要介紹了openFeign服務(wù)之間調(diào)用保持請求頭信息處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

