RetryerBuilder是Guava Retryer库中的一个类,可以用于构建带有重试机制的操作。RetryListener是RetryerBuilder中的一个接口,用于监听重试事件。在RetryerBuilder中使用外部方法,可以通过实现RetryListener接口并覆盖其方法来实现。

在RetryListener接口中,有以下几个方法:

  • onRetry(Attempt<T> attempt):在进行重试之前调用,可以在此方法中实现需要执行的逻辑。
  • onFailedAttempt(Attempt<T> attempt):在每次重试失败后调用,可以在此方法中实现需要执行的逻辑。
  • onRetryFailed(List<Attempt<T>> attempts):在所有重试都失败后调用,可以在此方法中实现需要执行的逻辑。

下面通过一个示例来演示如何在RetryerBuilder中使用外部方法。

首先,我们需要定义一个实现RetryListener接口的类,例如RetryListenerImpl:

import com.github.rholder.retry.Attempt;
import com.github.rholder.retry.RetryListener;

public class RetryListenerImpl implements RetryListener {

    @Override
    public <V> void onRetry(Attempt<V> attempt) {
        System.out.println("Retry #" + attempt.getAttemptNumber());
    }

    @Override
    public <V> void onFailedAttempt(Attempt<V> attempt) {
        System.out.println("Retry failed: " + attempt.getAttemptNumber());
    }

    @Override
    public <V> void onRetryFailed(List<Attempt<V>> attempts) {
        System.out.println("All retries failed");
    }
}

在上述代码中,我们分别实现了RetryListener接口中的三个方法,并在每个方法中打印了相应的信息。

接下来,我们可以使用RetryerBuilder来构建一个带有重试监听器的Retryer对象,如下所示:

import com.github.rholder.retry.RetryException;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.WaitStrategies;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class RetryerExample {

    public static void main(String[] args) {
        RetryListenerImpl retryListener = new RetryListenerImpl();

        Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
                .retryIfException()
                .retryIfResult(result -> result == null || result.isEmpty())
                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
                .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))
                .withRetryListener(retryListener)  // 注册监听器
                .build();

        Callable<String> callable = () -> {
            // 这里可以执行需要重试的操作
            // 模拟一个需要重试的操作,假设第一次调用返回null,后续两次调用返回空字符串
            if (retryer.getAttemptCount() == 1) {
                return null;
            } else {
                return "";
            }
        };

        try {
            String result = retryer.call(callable);
            System.out.println("Result: " + result);
        } catch (RetryException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们创建了一个RetryListenerImpl对象作为Retryer的监听器,并通过withRetryListener(retryListener)方法将其注册到RetryerBuilder中。

此外,我们还使用了RetryerBuilder的其他方法来配置重试的条件和策略,例如retryIfException()表示当出现异常时需要重试,retryIfResult(result -> result == null || result.isEmpty())表示当返回结果为null或空字符串时需要重试,withStopStrategy(StopStrategies.stopAfterAttempt(3))表示最多重试3次,withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))表示每次重试间隔1秒。

最后,我们通过retryer.call(callable)方法来执行需要重试的操作,即在callable对象的call方法中进行实际操作。如果所有重试都失败,则会抛出RetryException或ExecutionException异常。

通过以上示例,我们成功地在RetryerBuilder中使用了外部方法。

下面是RetryerBuilder withRetryListener的类图:

classDiagram
    class RetryerBuilder {
        + <T>RetryerBuilder<T> withRetryListener(RetryListener listener)
        + Retryer build()
    }
    class RetryListener {
        + <V>onRetry(Attempt<V> attempt)
        + <V>onFailedAttempt(Attempt<V> attempt)
        + <V>onRetryFailed(List<Attempt<V>>