CloseableHttpAsyncClient 使用注意事項

HttpAsyncClient apache的異步http請求封裝類,基於nio實現。

注意事項:

  1. RequestConfig的connectionRequestTimeout配置的是從開始調用execute方法到processPendingRequest所經過的時間,如果超過設置的時間拋出TimeoutException,此處的超時時間不是connection timeout 也不是 socket timeout.
  2. IoReactorConfig的IoThreadCount配置的是做輪詢處理io事件的線程數(默認Runtime.getRuntime().availableProcessors()), 在reactorThread中會檢測這些線程是否有執行異常,如果任意一個io線程有異常則會引發io reactor終止導致client shutdown.
  3. 在HttpAsyncClient的callback方法內不宜寫過多耗時的邏輯,會影響後續execute的性能,每次執行execute時會執行fireCallbacks,遍歷一次compeledRequest,執行對應的completed/cancel/failed操作,如果回調操作裏面比較耗時,在高併發量的情況下execute操作可能要耗時幾秒纔會往下繼續執行。

 

執行過程:

  1.  初始化HttpAsyncClient,常用的方式是通過HttpAsyncClients或HttpAsyncClientBuilder構建HttpAsyncClient實例,可實例化的實現類爲兩個繼承自CloseableHttpAsyncClientBase的包級可見類(InternalHttpAsyncClient/MinimalHttpAsyncClient)
  2. 通過構造器實例化並調用start方法啓動client,此時執行過程爲  new InternalHttpAsyncClient  -> CloseableHttpAsyncClientBase.start[reactorThread.start() -> doExecute()] -> PoolingNHttpClientConnectionManager.execute -> AbstractMultiworkerIOReactor.execute[init & start WorkThread(dispatcher,event), selector]此時,client啓動完畢,會啓動n個workThread工作線程(每個線程for死循環形式通過selector不斷輪詢事件),一個reactorThread不斷通過selector輪詢socket事件,當輪循到事件發生時,會將交由AbstractMultiworkerIOReactor的兩個實現類處理(DefaultConnectingIOReactor/DefaultListeningIOReactor), 這兩個實現類分別處理連接事件和讀寫事件,分別取出事件selectedKeys處理髮生的事件。根據selectionKey狀態封裝爲Channel,隨機取一個dispatcher添加到dispatcher的channel內. 在workThread輪循到事件後,根據事件類型再做處理分發。
  3. 當通過httpAsyncClient.execute方法發送請求時,執行過程爲:CloseableHttpAsyncClient.execute -> InternalHttpAsyncClient.execute -> DefaultClientExchangeHandlerImpl.start[requestConnection()] -> PoolingNHttpClientConnectionManager.requestConnection -> AbstractNIOConnPool.lease, 主要請求邏輯在lease方法內,當對用route有可用連接的時候,會創建鏈接,否則加到requestQueue隊列(最終由DefaultConnectingIOReactor/DefaultListeningIOReactor遍歷queue做請求操作),之後要對completedRequest做一次遍歷調用callback操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章