AsyncHttpClient的连接池使用逻辑
AsyncHttpClient的連接池結(jié)構(gòu)很簡單, NettyConnectionsPool內(nèi)部重要的幾個變量如下
// 連接池, 通過 host 區(qū)分不同的池private final ConcurrentHashMap<String, ConcurrentLinkedQueue<IdleChannel>> connectionsPool = new ConcurrentHashMap<String, ConcurrentLinkedQueue<IdleChannel>>();// 原生channel跟IdleChannel對象的映射, IdleChannel主要是包含一些請求信息, 請求url以及請求開始時間private final ConcurrentHashMap<Channel, IdleChannel> channel2IdleChannel = new ConcurrentHashMap<Channel, IdleChannel>();// 記錄了Channel的創(chuàng)建時間, 用于做Channel生命周期檢測, 如果生命周期是-1, 此Map無用private final ConcurrentHashMap<Channel, Long> channel2CreationDate = new ConcurrentHashMap<Channel, Long>();?
主要邏輯都位于NettyAsyncHttpProvider下
1. 取出連接池連接(doConnection階段)
先從連接池取出連接, 取出連接后會將連接從connectionsPool的數(shù)量會減少
如果連接存在, 取出來以后直接就會返回future. 否則進入下列流程
?
2. 對池內(nèi)連接的控制 (doConnect階段)
在doConnect的時候會判斷connectionsPool是否可cache, 如下
其中channel2IdleChannel在連接池poll的時候會remove channel, 也就是說判斷的連接數(shù)是在池內(nèi)的channel數(shù)
加入返回false, 則會調(diào)用asyncHandler的onThrowable()方法, 并拋出 "Too many connections " 異常
provider對這一步的判斷在 3) 的判斷之前
?
3. 對池外連接的控制 (doConnect階段)
池外連接使用
private Semaphore freeConnections = null;
進行控制, 他的值為 MaxTotalConnections, 這個值和連接池的是一樣的, 邏輯如下
默認調(diào)用的
public <T> ListenableFuture<T> execute(Request request, AsyncHandler<T> handler) throws IOException;
方法, reclaimCache 都為 false
?
4. 向連接池添加連接邏輯 (Protocol handle()階段)
在provider的HttpProtocol類里會調(diào)finishUpdate()方法, 這里會執(zhí)行向連接池添加連接的操作, 調(diào)用offer方法
連接池的offer方法沒有對maxTotalConnections的判斷, 只對maxConnectionPerHost做判斷
轉(zhuǎn)載于:https://www.cnblogs.com/zemliu/p/3690038.html
總結(jié)
以上是生活随笔為你收集整理的AsyncHttpClient的连接池使用逻辑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 向linux内核版本号添加字符/为何有时
- 下一篇: 河流Shader