Java HttpClient 4.x运行时出现一些随机错误
我正在尽可能快地访问上千个URL。使用Apache HTTPClient v4.x,我可以做到这一点,但通常会有大约3-5%的请求以任一主机查找失败告终(这在执行大量请求时很常见,有些请求不可避免地会失败。例如,您可以允许作业自己重新提交(次数有限…)给执行者重试。要么某个迭代成功完成了未来,要么最后一次尝试例外地完成。@radai:这意味着我取出了disableAutomaticRetries(),即使有些请求失败,你建议我使用单独的HttpClient重试还是使用同一个HttpClient重试?还有一件事:关于“java.net.UnknownHostException”,你认为我得到这些信息是因为请求量大还是因为DNS查找速度慢?这在处理大量请求时很常见-一些请求不可避免地会失败。例如,你可以允许作业自己重新提交(有限的次数…)给执行者重试。要么某个迭代成功完成了未来,要么最后一次尝试例外地完成。@radai:这意味着我删除了disableAutomaticRetries(),即使某些请求失败,您建议我使用单独的HttpClient重试还是使用相同的HttpClient重试?还有一件事:关于“你认为我得到这些是因为请求量大还是因为DNS查找速度慢?Java HttpClient 4.x运行时出现一些随机错误,java,apache,apache-httpclient-4.x,Java,Apache,Apache Httpclient 4.x,我正在尽可能快地访问上千个URL。使用Apache HTTPClient v4.x,我可以做到这一点,但通常会有大约3-5%的请求以任一主机查找失败告终(这在执行大量请求时很常见,有些请求不可避免地会失败。例如,您可以允许作业自己重新提交(次数有限…)给执行者重试。要么某个迭代成功完成了未来,要么最后一次尝试例外地完成。@radai:这意味着我取出了disableAutomaticRetries(),即使有些请求失败,你建议我使用单独的HttpClient重试还是使用同一个HttpClient重
public static ExecutorService pool = Executors.newFixedThreadPool(400);
AppConfig.monitors.forEach((key, monitor) -> {
results.add(AppConfig.pool.submit(new WebRequest(monitor)));
}
});
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)
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();
}
}
}