赞
踩
Spring Retry 为 Spring 应用程序提供了声明性重试支持。它用于Spring批处理、Spring集成、Apache Hadoop(等等)。它主要是针对可能抛出异常的一些调用操作,进行有策略的重试
1.准备工作
我们只需要加上依赖:
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.2.RELEASE</version> </dependency>
准备一个任务方法,我这里是采用一个随机整数,根据不同的条件返回不同的值,或者抛出异常
package com.zgd.demo.thread.retry; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomUtils; import org.springframework.remoting.RemoteAccessException; /** * @Author: zgd * @Description: */ @Slf4j public class RetryDemoTask { /** * 重试方法 * @return */ public static boolean retryTask(String param) { log.info("收到请求参数:{}",param); int i = RandomUtils.nextInt(0,11); log.info("随机生成的数:{}",i); if (i == 0) { log.info("为0,抛出参数异常."); throw new IllegalArgumentException("参数异常"); }else if (i == 1){ log.info("为1,返回true."); return true; }else if (i == 2){ log.info("为2,返回false."); return false; }else{ //为其他 log.info("大于2,抛出自定义异常."); throw new RemoteAccessException("大于2,抛出远程访问异常"); } } }
2.使用SpringRetryTemplate
这里可以写我们的代码了
package com.zgd.demo.thread.retry.spring; import com.zgd.demo.thread.retry.RetryDemoTask; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.springframework.remoting.RemoteAccessException; import org.springframework.retry.backoff.FixedBackOffPolicy; import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.support.RetryTemplate; import java.util.HashMap; import java.util.Map; /** * @Author: zgd * @Description: spring-retry 重试框架 */ @Slf4j public class SpringRetryTemplateTest { /** * 重试间隔时间ms,默认1000ms * */ private long fixedPeriodTime = 1000L; /** * 最大重试次数,默认为3 */ private int maxRetryTimes = 3; /** * 表示哪些异常需要重试,key表示异常的字节码,value为true表示需要重试 */ private Map<Class<? extends Throwable>, Boolean> exceptionMap = new HashMap<>(); @Test public void test() { exceptionMap.put(RemoteAccessException.class,true); // 构建重试模板实例 RetryTemplate retryTemplate = new RetryTemplate(); // 设置重试回退操作策略,主要设置重试间隔时间 FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); backOffPolicy.setBackOffPeriod(fixedPeriodTime); // 设置重试策略,主要设置重试次数 SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(maxRetryTimes, exceptionMap); retryTemplate.setRetryPolicy(retryPolicy); retryTemplate.setBackOffPolicy(backOffPolicy); Boolean execute = retryTemplate.execute( //RetryCallback retryContext -> { boolean b = RetryDemoTask.retryTask("abc"); log.info("调用的结果:{}", b); return b; }, retryContext -> { //RecoveryCallback log.info("已达到最大重试次数或抛出了不重试的异常~~~");
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。