在项目项目里面我们会涉及到调用第三方,那么调用第三方的时候经常会出现第三方不稳定的情况,此时我们程序就会出现错误。不严谨的程序遇到错误就会停止继续往下走,严谨一点的程序就会写很多的循环加上重试等,今天我们介绍一个经常使用到的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框架是线程安全的,可以放心使用。
还没有评论,来说两句吧...