问题
使用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
,lambda 需要返回U
而不是CompletionStage<U>
那里。
其他框架
为了质量保证,我也对展示如何使用其他框架实现这一目标的答案感兴趣,但我不会接受它们。
例如,我见过一个名为Failsafe的库,它可能为此提供了一个优雅的解决方案(请参阅jodah.net/failsafe)。
参考
作为参考,这里有一些相关的 JavaDoc 链接: