首页 > 解决方案 > Java HttpClient 4.x Runnng 出现一些随机错误

问题描述

我正在尝试尽快对数千个 URL 进行 GET。使用 Apache HTTPClient v4.x 我可以做到这一点,但通常最终有大约 3-5% 的请求以任一主机查找失败(<10% 的错误)而其余的要么超时(<10% ) 或网络读取错误。

所以基本上我的循环遍历 URL 并将工作线程提交给 Executor 服务。以下是重要部分的代码片段:

执行者--------

public static ExecutorService pool = Executors.newFixedThreadPool(400);   
AppConfig.monitors.forEach((key, monitor) -> {
        results.add(AppConfig.pool.submit(new WebRequest(monitor)));
    }
});

笔记:

  1. 我已经尝试了 50-1000 之间的所有线程数范围。
  2. 我将它提交给一个可调用线程,该线程返回一个未来,并在后续循环中迭代结果。

客户代码----------

cm = new PoolingHttpClientConnectionManager();
cm.setDefaultMaxPerRoute(2);
cm.setMaxTotal(1000);

RequestConfig rc = RequestConfig.custom()
    .setSocketTimeout(4000)
    .setConnectTimeout(4000)
    .setCookieSpec(CookieSpecs.IGNORE_COOKIES)
    .setMaxRedirects(1)
    .setRedirectsEnabled(true)
    .setCircularRedirectsAllowed(false)
    .build();
sslContext = SSLContextBuilder
                .create()
                .loadTrustMaterial(TrustSelfSignedStrategy.INSTANCE)
                .build();
sslcsf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
client = HttpClients.custom()
            .setConnectionManager(cm)
            .setDefaultHeaders(headers)
            .setDefaultRequestConfig(rc)
            .setSSLSocketFactory(sslcsf)
            .disableAutomaticRetries()
            .setRedirectStrategy(DefaultRedirectStrategy.INSTANCE)

笔记:

  1. 所有 URL 都是最终的,没有常规或循环重定向。
  2. 另请注意,我一次通过 HTTPClient 运行这些 URL,它们可以正常工作。所以一般来说不应该发生超时。
  3. 所有域都可以访问。

请求代码 - - - - - -

public class WebRequest implements Callable<Monitor> {
    @Override
    public Monitor call() throws Exception {
        HttpRequestBase request;
        HttpContext context = HttpClientContext.create();
        request = new HttpGet(monitor.getUrl());
        try (CloseableHttpResponse response = WebClient.client.execute(request, context);) {
            request.releaseConnection();
        }
    }
}

如果您需要更多信息,请告诉我。

标签: javaapacheapache-httpclient-4.x

解决方案


推荐阅读