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));