首页 > 解决方案 > 根据结果​​重试方法(而不是异常)

问题描述

我有一个具有以下签名的方法:

public Optional<String> doSomething() {
    ...
}

如果我得到一个空的Optional,我想重试这个方法,并且只有在 3 次之后才返回空Optional

我查看并找到了Retryablespring 注释,但它似乎只适用于异常。

如果可能的话,我想为此使用一个库,并避免:

标签: javaspringspring-retry

解决方案


我一直在重试中使用故障安全构建。您可以根据谓词和异常重试。

您的代码如下所示:

    private Optional<String> doSomethingWithRetry() {
        RetryPolicy<Optional> retryPolicy = new RetryPolicy<Optional>()
                .withMaxAttempts(3)
                .handleResultIf(result -> {
                    System.out.println("predicate");
                    return !result.isPresent();
                });

        return Failsafe
                .with(retryPolicy)
                .onSuccess(response -> System.out.println("ok"))
                .onFailure(response -> System.out.println("no ok"))
                .get(() -> doSomething());
    }

    private Optional<String> doSomething() {
         return Optional.of("result");
    }

如果可选项不为空,则输出为:

predicate
ok

否则看起来像:

predicate
predicate
predicate
no ok

推荐阅读