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>>