使用池连接管理器时,为什么我的HTTPClient会耗尽连接?

时间:2015-10-26 06:05:57

标签: java scala connection-pooling apache-httpclient-4.x apache-commons-httpclient

我正在使用Apache HttpComponents 4.5.1。在Scala项目中,Scala不太可能成为我的问题。这是一个JUnit 4样式测试。

@Test def closableHttpClientWithPoolingCmTest{
  val poolingHttpConnectionManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager()
  poolingHttpConnectionManager setMaxTotal (12)
  poolingHttpConnectionManager setDefaultMaxPerRoute (8)
  def client = HttpClients custom () setConnectionManager  (poolingHttpConnectionManager) build ()
  for (i  <- 0 to 12 ){
    def response = client.execute(new HttpGet("http://www.yahoo.com"));
    EntityUtils.consume(response.getEntity)
    response.close();
  }
}

此测试挂起,因为我们的连接用完了。我缺少什么?我使用实体并关闭响应。除了response之外,我还需要关闭其他任何内容吗? 请帮忙。

1 个答案:

答案 0 :(得分:1)

您的客户定义应为val而不是def

每次调用def时都会对

client进行评估,从而为每次调用创建一个新池。相反,使用val,您的池将被构造一次并重复使用。

def client = HttpClients custom () setConnectionManager (poolingHttpConnectionManager) build ()

应该成为

val client = HttpClients custom () setConnectionManager (poolingHttpConnectionManager) build ()