HttpClient卡住,没有任何异常

2022-09-01 14:17:25

我正在开发一个长时间运行的应用程序,该应用程序大量使用apache的HttpClient。

在我的第一次测试运行中,应用程序运行良好,直到它卡住。它没有停止,它没有抛出任何异常,它只是坐在那里什么都不做。

我刚才做了第二次跑步,停止了时间,在大约24小时的连续跑步后,它停止了。此外,我注意到我运行它的笔记本电脑的互联网连接在应用程序卡住的那一刻终止了。我不得不重新启动我的WLAN适配器才能使网络再次运行。

但是,该应用程序在连接再次启动后没有恢复工作。而现在,它又卡住了。

在 HttpClient 中是否有任何我不知道的超时控制器?为什么我的应用程序在连接断开时不引发异常?

使用客户端的部分如下所示;

public HttpUtil(ConfigUtil config) {
    this.config = config;

    client = new DefaultHttpClient();
    client.getParams().setParameter(HttpProtocolParams.USER_AGENT, this.config.getProperty("httputil.userAgent"));
}

public String getContentAsString(String url) throws ParseException, ClientProtocolException, IOException {
    return EntityUtils.toString(
            client.execute(
                    new HttpGet(url)).getEntity());
}

应用程序反复调用所需的 URL。httputil.getContentAsString()


答案 1

此代码现已弃用(获取 HttpParams 等)。更好的方法是:

RequestConfig defaultRequestConfig = RequestConfig.custom()
    .setCookieSpec(CookieSpecs.BEST_MATCH)
    .setExpectContinueEnabled(true)
    .setStaleConnectionCheckEnabled(true)
    .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
    .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
    .build();

HttpGet httpGet = new HttpGet(url);    
RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
    .setSocketTimeout(5000)
    .setConnectTimeout(5000)
    .setConnectionRequestTimeout(5000)
    .build();
httpGet.setConfig(requestConfig);

答案 2

从版本4.4开始,用户user2393012和Stephen C的答案都已被弃用。我不确定是否有另一种方法可以做到这一点,但我这样做的方法是使用构建器范例HTTPClientBuilder。

前任。

HttpClients.custom().setConnectionTimeToLive(1, TimeUnit.MINUTES).build()

与OP提到的非常相似(实际上可能是OP的问题)问题也发生了,但是由于Apache将默认的并发连接设置为每个客户端只有两个连接。解决此问题的方法是增加最大连接数或关闭它们(如果可以的话)。

要增加最大连接数:

HttpClients.custom().setMaxConnPerRoute(100000).build()

若要关闭连接,可以使用 BasicHttpClientConnectionManager 并调用 close 方法


推荐