Проблема
Используя HttpClient
из Java 11 (JDK, а не Apache), как я могу повторить запросы?
Допустим, я хочу повторить запрос до 10 раз, если он не вернул код состояния 200
или не выдал исключение.
Пытаться
В настоящее время я сочиняю возвращенное будущее с повторными расписаниями в цикле, и мне интересно, может ли быть лучший или более элегантный способ.
CompletableFuture<HttpResponse<Foo>> task = client.sendAsync(request, bodyHandler);
for (int i = 0; i < 10; i++) {
task = task.thenComposeAsync(response -> response.statusCode() == 200 ?
CompletableFuture.completedFuture(response) :
client.sendAsync(request, bodyHandler));
}
// Do something with 'task' ...
И если мы добавим повторные попытки для исключительных случаев, я получу
CompletableFuture<HttpResponse<Foo>> task = client.sendAsync(request, bodyHandler);
for (int i = 0; i < 10; i++) {
task = task.thenComposeAsync(response ->
response.statusCode() == 200 ?
CompletableFuture.completedFuture(response) :
client.sendAsync(request, bodyHandler))
.exceptionallyComposeAsync(e ->
client.sendAsync(request, bodyHandler));
}
// Do something with 'task' ...
К сожалению, похоже, что нет никакого composeAsync
, который срабатывает как для обычного завершения, так и для исключительного. Есть handleAsync
но не compose
, лямбда нужна чтобы вернуть U
а не CompletionStage<U>
там.
Другие фреймворки
Ради контроля качества меня также интересуют ответы, которые показывают, как добиться этого с другими фреймворками, но я их не приму.
Например, я видел библиотеку под названием Failsafe, которая могла бы предложить изящное решение этой проблемы (см. jodah.net/failsafe).
Ссылка
Для справки, вот некоторые связанные ссылки JavaDoc: