根据结果​​重试方法(而不是异常)

ori*_*rab 10 java spring spring-retry

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

public Optional<String> doSomething() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 创建和抛出异常。
  • 自己写逻辑。

Cri*_*uez 5

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

您的代码如下所示:

    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");
    }
Run Code Online (Sandbox Code Playgroud)

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

predicate
ok
Run Code Online (Sandbox Code Playgroud)

否则看起来像:

predicate
predicate
predicate
no ok
Run Code Online (Sandbox Code Playgroud)