Откат повторных попыток с клиентскими запросами Apache HTTP по любой причине
У меня есть HTTP-запрос POST, который на самом деле не идемпотентен, но повторять его более важно, чем просто сдаться. Код запускается в AWS Lambda с 5-минутным тайм-аутом, и в наших же интересах, чтобы он продолжал пытаться в течение этих 300 секунд максимально удовлетворить этот запрос. В библиотеке слишком много значений повторов и тайм-аутов, и я запутался.
HttpClientBuilder httpClientBuilder = null;
CachingHttpClientBuilder hcb = CachingHttpClientBuilder.create();
CacheConfig cc = CacheConfig.DEFAULT;
final long backOffRate = 2;
final long initialExpiry = TimeUnit.SECONDS.toMillis(5);
// Lambda timeout is already 300s
// 5 * 2^0 , 5 * 2^1 .., 5 * 2^n (n tries) < 300s
// 5, 10, 20, 40, 80, ~160 // Not done
final long maxExpiry = TimeUnit.SECONDS.toMillis(250);
ExponentialBackOffSchedulingStrategy ebo = new ExponentialBackOffSchedulingStrategy(
cc,
backOffRate,
initialExpiry,
maxExpiry
);
RequestConfig.Builder requestBuilder = RequestConfig
.custom()
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.setConnectionRequestTimeout(5000);
hcb
.setSchedulingStrategy(ebo)
.setDefaultRequestConfig(requestBuilder.build())
.setConnectionBackoffStrategy(new DefaultBackoffStrategy())
;
HttpClientBuilder.create()
.setRetryHandler((exception, executionCount, context) -> executionCount < 5);
CloseableHttpClient build = hcb.build();
HttpUriRequest request = new HttpGet("http://localhost:19000");
build.execute(request);
Я написал приведенный выше код и использовал nc -l -k 19000
в другом терминале, но это просто дает Exception in thread "main" java.net.SocketTimeoutException: Read timed out
Как правильно делать хорошие экспоненциальные повторные попытки?