2014-01-09 52 views
2

我在我的項目中使用http-client 4.3.x。爲了關閉「閒置」連接,我啓動了一個線程來監視連接池,並嘗試關閉每秒鐘閒置30秒的連接。如何測試我的httpClient可以關閉閒置連接?

的的ConnectionManager:

PoolingHttpClientConnectionManager connectionManager = 
    new PoolingHttpClientConnectionManager(registry); 

的線程來監視並關閉閒置連接:

class ClosingIdleConnectionThread extends Thread { 
    private final PoolingHttpClientConnectionManager connectionManager; 
    private final int timeout; 

    public ClosingIdleConnectionThread(PoolingHttpClientConnectionManager connectionManager, int timeout) { 
     this.connectionManager = connectionManager; 
     this.timeout = timeout; 
    } 

    @Override 
    public void run() { 
     while (!Thread.currentThread().isInterrupted()) { 
      connectionManager.closeIdleConnections(timeout, TimeUnit.MILLISECONDS); 
      connectionManager.closeExpiredConnections(); 
      try { 
       TimeUnit.SECONDS.sleep(1); 
      } catch (InterruptedException e) { 
       return; 
      } 
     } 
    } 
} 

但現在我有兩個問題:

  1. 其實,我不是確定「閒置」連接意味着什麼
  2. 我要wr伊特一些測試,以確保我的代碼工作,但我不知道如何測試它

感謝您的幫助〜

+1

看起來while循環永遠不會進入,因爲如果你沒有被中斷,Thread.currentThread()。isInterrupted()將返回false。 – Stephan

+0

感謝您收到此錯誤!剛剛在語句前添加了'!' – Freewind

回答

2

(1)持續的連接將被視爲空閒,如果它沒有被從游泳池租用。空閒5秒=尚未租用5秒鐘。

(2)這是一個艱難的。我在這裏看到兩個選項

  • 使用PowerMock,工具SocketImpl抽象類和'間諜'的#close方法。免責聲明:我沒有嘗試過。這只是一個想法,它可能會不是工作。

  • 改爲使用Mockito或類似的工具包和間諜PlainConnectionSocketFactory實例。通過連接池管理器註冊Mockito增強實現。計算已調用#connectSocket方法的次數。如果該方法在新的連接租約長時間不活動時被調用,則基本上意味着兩件事之一:池爲空或空閒連接未處於可重用狀態。這不是一個完美的測試,但它可能更容易實現,因爲它不需要PowerMock的classloader魔法。

+0

如果一個連接收到所有的響應數據並返回到池中,它是否仍然保持與服務器的連接? – Freewind

+0

是的,它會的。如果連接可以保持活着,它將保持活着。 – oleg