Failsafe RetryPolicy - выдает исключение из supplyAsync

Я реализую политику повторных попыток. По сути, я хочу повторить запрос POST в отдельном потоке. Я использую отказоустойчивый Jhalterman ( https://github.com/jhalterman/failsafe) Вот мой код

Failsafe.with(retryPolicy).with(executor).future(() -> CompletableFuture.supplyAsync(() -> {
            try {
                CloseableHttpResponse response = client.execute(httpPost);
                httpPost.releaseConnection();
                client.close();
                return response;
            } catch (IOException e) {
                return null;
            }
        }).thenApplyAsync(response -> "Response: " + response)
          .thenAccept(System.out::println));

Я не хочу ловить IOException здесь. Это обрабатывается политикой повторных попыток. В настоящее время повторных попыток не произойдет, так как я ловлю здесь исключение. Есть ли способ вызвать исключение из "supplyAsync", чтобы оно было обработано политикой повторных попыток? Благодарю. Спасибо

1 ответ

Решение

API CompletionStage предоставляет несколько различных способов обработки и работы с непроверенными исключениями. Но в вашем случае вы получаете исключение Checked, и вам не повезло. Вы должны либо справиться с этим, либо выбросить его наружу по направлению к своему абоненту. Вот один из способов сделать это, если вы предпочитаете последний подход.

Failsafe.with(retryPolicy).with(executor).future(() -> CompletableFuture.supplyAsync(() -> {
            try {
                // Remainder omitted
                return response;
            } catch (IOException e) {
                throw new CompletionException(e);
            }
        }).thenApplyAsync(response -> "Response: " + response)
          .thenAccept(System.out::println));
Другие вопросы по тегам