java - 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)));
}
});
笔记:
- 我已经尝试了 50-1000 之间的所有线程数范围。
- 我将它提交给一个可调用线程,该线程返回一个未来,并在后续循环中迭代结果。
客户代码----------
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)
笔记:
- 所有 URL 都是最终的,没有常规或循环重定向。
- 另请注意,我一次通过 HTTPClient 运行这些 URL,它们可以正常工作。所以一般来说不应该发生超时。
- 所有域都可以访问。
请求代码 - - - - - -
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();
}
}
}
如果您需要更多信息,请告诉我。
解决方案
推荐阅读
- prolog - Prolog:确定学生答案和成绩已知的多项选择题测试的答案
- hangfire - 在解决方案结构中,我如何以及在何处实施我的循环 Hangfire 作业?任何示例应用程序?
- wordpress - 我的 style.css 被 wordpress 默认 style.min.css 覆盖
- javascript - 如何使用 Apex 图表设置全局选项?
- xsd - 简单 XSD 架构
- arrays - EXCEL:单元格中的数组。如何取回数组?
- shell - 如果选项错误,我该如何恢复?
- nginx - Nginx 入口 kubernetes 代理通行证
- java - 捕获springboot中用户名密码错误的SQL连接错误
- javascript - 使用单选按钮调用 PHP 函数