在项目项目里面我们会涉及到调用第三方,那么调用第三方的时候经常会出现第三方不稳定的情况,此时我们程序就会出现错误。不严谨的程序遇到错误就会停止继续往下走,严谨一点的程序就会写很多的循环加上重试等,今天我们介绍一个经常使用到的spring-retry来给大家简化下代码。实现重试很简单。
先介绍下spring-retry,这是srping框架自动提供给我们的一个重试框架,我们可以直接拿来就用。使用这个框架需要注意如下几点:
1、声明异常类,这里我们一般都全局使用一个自定义的类即可。所有需要重试的业务如果不满足预期,手动抛出这个异常即可。 2、声明下重试次数,一般为3次, 3、声明下重试的时间间隔,这个具体以实际业务为准。
下面我们开始演示如何操作。
1)、创建一个maven项目,引入maven依赖
<dependency> <groupId>com.github.rholder</groupId> <artifactId>guava-retrying</artifactId> <version>2.0.0</version> </dependency>
2)、自定义一个异常类
package com.test.retry;
public class RetryException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
public RetryException() {
super();
}
public RetryException(String s) {
super(s);
}
}3)、模拟一个需要重试的task方法
package com.test.retry;
import java.util.Random;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class RetryTask {
private static final Random RANDOM = new Random();
public Integer retryMethod() {
int aaa = RANDOM.nextInt(10);
log.info("执行了一次");
if(aaa < 4)
throw new RetryException("随机值小于3");
else
return aaa;
}
}4)使用spring-retry执行这个重试方法
package com.test.retry;
import java.util.HashMap;
import java.util.Map;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SpringRetryDemo {
private static Map<Class<? extends Throwable>, Boolean> exceptionMap = new HashMap<Class<? extends Throwable>, Boolean>();
public static void main(String[] args) {
exceptionMap.put(RetryException.class, true);
// 构建重试模板实例
RetryTemplate retryTemplate = new RetryTemplate();
// 设置重试回退操作策略,主要设置重试间隔时间
FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
backOffPolicy.setBackOffPeriod(1000L);// 这里的重试间隔时间单位为毫秒,这里我们设置为间隔1秒重试
// 设置重试策略,主要设置重试次数
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(3, exceptionMap);
retryTemplate.setRetryPolicy(retryPolicy);
retryTemplate.setBackOffPolicy(backOffPolicy);
Integer result = retryTemplate.execute(// RetryCallback
retryContext -> {
RetryTask retryTask = new RetryTask();
Integer b = retryTask.retryMethod();
log.info("调用的结果:{}", b);
return b;
}, retryContext -> {
// RecoveryCallback
log.info("已达到最大重试次数或抛出了不重试的异常~~~");
return -1;
});
log.info("执行结果是:{}", result);
}
}具体如何使用已经在注释里面编写了,所以大家直接看就可以了,在实际的使用中,这里的spring-retry可以直接构造成一个公共的方法进行调用即可,就不用每次使用的时候都进行new。
最后我们执行一下,看下效果。
还有这个spring-retry框架是线程安全的,可以放心使用。










还没有评论,来说两句吧...