Откат повторных попыток с клиентскими запросами 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

Как правильно делать хорошие экспоненциальные повторные попытки?

0 ответов

Другие вопросы по тегам