sno*_*ndy 3 httpclient apache-commons-httpclient apache-httpclient-4.x
有人可以分享如何配置现代HttpClient 4.5.3重试失败的请求并等待一段时间再重试之前?
到目前为止,我看起来正确,.setRetryHandler(new DefaultHttpRequestRetryHandler(X, false))它将允许重试X次请求.
但我无法理解如何配置退避:.setConnectionBackoffStrategy()/ .setBackoffManager()根据JavaDocs调节其他内容,而不是重试之间的超时.
关于动态延迟,我想提出以下建议:
CloseableHttpClient client = HttpClientBuilder.create()
.setRetryHandler(new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
return executionCount <= maxRetries ;
}
})
.setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {
int waitPeriod = 100;
@Override
public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
waitPeriod *= 2;
return executionCount <= maxRetries &&
response.getStatusLine().getStatusCode() >= 500; //important!
}
@Override
public long getRetryInterval() {
return waitPeriod;
}
})
.build();
Run Code Online (Sandbox Code Playgroud)
附录:请注意,如果出现超时、端口未打开或连接关闭等 IO 错误,则不会调用 ServiceUnavailableRetryStrategy.retryRequest。在这种情况下,只会调用 HttpRequestRetryHandler.retryRequest ,并且重试将立即发生或在固定延迟后发生(我最终无法澄清这一点)。所以 oleg 的答案实际上是正确的。在 HttpClient 4.5 的支持下无法做到这一点。
(我实际上想将其称为设计错误,因为在现代微服务环境中,IO 错误后的延迟重试至关重要。)
BackoffManager/ ConnectionBackoffStrategycombo可用于根据I/O错误率和503响应动态增加或减少每个路由限制的最大连接数.它们对请求执行没有影响,不能用于控制请求重新执行
这是使用HC 4.x API最好的方法
CloseableHttpClient client = HttpClientBuilder.create()
.setRetryHandler(new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
return executionCount <= maxRetries &&
exception instanceof SocketException;
}
})
.setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {
@Override
public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
return executionCount <= maxRetries &&
response.getStatusLine().getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE;
}
@Override
public long getRetryInterval() {
return 100;
}
})
.build();
Run Code Online (Sandbox Code Playgroud)
请注意,目前还没有优雅的方法在I/O错误的情况下强制执行请求执行尝试之间的延迟,或者根据请求路由动态调整重试间隔.
| 归档时间: |
|
| 查看次数: |
3434 次 |
| 最近记录: |