CompletableFuture 重试 请给个demo
时间: 2024-05-18 08:09:57 浏览: 171
CompletableFuture是Java 8中的一个非常强大的异步编程工具,可以简化异步编程的复杂性。如果需要进行重试,可以使用CompletableFuture的一些方法来实现。
下面是一个简单的示例代码,展示了如何在CompletableFuture中实现重试:
```java
public static <T> CompletableFuture<T> retry(Supplier<CompletableFuture<T>> action, int maxRetries, int retryDelay) {
CompletableFuture<T> future = new CompletableFuture<>();
action.get().whenCompleteAsync((result, throwable) -> {
if (throwable == null) {
future.complete(result);
} else if (maxRetries > 0) {
System.out.println("Retrying after delay: " + retryDelay + " ms");
CompletableFuture.delayedExecutor(retryDelay, TimeUnit.MILLISECONDS).execute(() -> {
retry(action, maxRetries - 1, retryDelay * 2).whenComplete((res, t) -> {
if (t != null) {
future.completeExceptionally(t);
} else {
future.complete(res);
}
});
});
} else {
future.completeExceptionally(throwable);
}
});
return future;
}
```
该方法接受三个参数:一个用于执行操作的Supplier,一个最大重试次数和一个重试延迟时间。在每次执行操作时,该方法会检查操作是否成功。如果操作成功,则返回结果。否则,将会等待一段时间后重试。重试次数和延迟时间会随着重试次数的增加而增加。
下面是一个使用该方法的示例:
```java
CompletableFuture<String> future = retry(() -> {
return CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException("Error");
} else {
return "Success";
}
});
}, 3, 100);
```
该示例会在CompletableFuture中执行一个随机操作,如果操作失败,则会进行最多三次重试,每次重试之间会等待100毫秒。如果所有重试都失败,则会返回一个异常。
阅读全文