【问题标题】:Apache HttpComponents code causing thread to blockApache HttpComponents 代码导致线程阻塞
【发布时间】:2013-10-12 15:06:46
【问题描述】:

我目前正在运行一个程序,该程序将使用 Apache HttpComponents 从网站下载源代码。我将下载很多(10,000 次),因此我使用多个线程来执行此操作。

有时所有线程都死掉(加入),有时它们不会。通过调试我确定该行

CloseableHttpResponse response = httpClient.execute(httpget,context);

是问题所在。有谁知道我如何为这一行设置超时,或者为什么这一行会阻塞线程执行?

【问题讨论】:

  • 您使用的是什么连接管理器?您应该使用 PoolingClientConnectionManager。

标签: java multithreading apache-httpcomponents


【解决方案1】:

线程卡在 i/o 操作中可能有多种原因,最可能的原因是不正确的超时设置。可以使用RequestConfig 类设置所需的超时值。但是,如果所有线程在#execute 方法中同时被阻塞,则连接泄漏(连接池耗尽)的可能性更大。确保您始终关闭 CloseableHttpResponse 实例,即使不关心响应或其内容。如logging guide中所述,您可以通过打开连线/上下文日志记录来了解有关请求执行的更多详细信息

【讨论】:

    【解决方案2】:

    我在代码中的HttpConnectionParams 中使用了以下超时设置(HttpParams 被赋予HttpClient 构造函数):

    org.apache.http.params.HttpConnectionParams.setConnectionTimeout(HttpParams, int)
    org.apache.http.params.HttpConnectionParams.setSoTimeout(HttpParams, int)
    

    我在使用多个线程连接到同一主机时发现的一个问题,当maxPerRoute 设置低于线程数时会发生阻塞/超时。看看PoolingClientConnectionManager

    org.apache.http.impl.conn.PoolingClientConnectionManager.setDefaultMaxPerRoute(int)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多