guava-retry使用笔记
xml依赖
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>2.0.0</version>
</dependency>
使用案例
重试3次,每次间隔3秒
@Test
void testGuavaRetry(){
Callable<Boolean> callable = ()->{
log.info("call task... ...");
throw new RuntimeException();
};
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfResult(Objects::isNull)
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.retryIfResult(res->res=false)
.withWaitStrategy(WaitStrategies.fixedWait(3, TimeUnit.SECONDS))
.withStopStrategy(StopStrategies.stopAfterAttempt(3))
.build();
try {
retryer.call(callable);
}catch (RetryException | ExecutionException e){
e.printStackTrace();
}
}
以指数递增的间隔等待重试
@Test
void testGuavaRetry2(){
Callable<Boolean> callable = ()->{
log.info("call task... ...");
throw new RuntimeException();
};
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.withWaitStrategy(WaitStrategies
.exponentialWait(100,5,TimeUnit.MINUTES))
.withStopStrategy(StopStrategies.neverStop())
.build();
try {
retryer.call(callable);
}catch (RetryException | ExecutionException e){
e.printStackTrace();
}
}
失败后重试,按斐波那契回退间隔重试
@Test
void testGuavaRetry3(){
Callable<Boolean> callable = ()->{
log.info("call task... ...");
throw new RuntimeException();
};
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfExceptionOfType(IOException.class)
.retryIfRuntimeException()
.withWaitStrategy(WaitStrategies
.fibonacciWait(100,2,TimeUnit.MINUTES))
.withStopStrategy(StopStrategies.neverStop())
.build();
try {
retryer.call(callable);
}catch (RetryException | ExecutionException e){
e.printStackTrace();
}
}