Spring @Retryable重试方法调用详解

Spring @Retryable重试方法调用详解

一、使用方法
1.引入maven包
 <!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
 <dependency>
     <groupId>org.springframework.retry</groupId>
     <artifactId>spring-retry</artifactId>
     <version>1.2.4.RELEASE</version>
 </dependency>
2.配置启用重试功能

1.springboot项目可以直接在启动类上添加注解:@EnableRetry

@SpringBootApplication
@EnableRetry
public class XXXApplication {
	public static void main(String[] args) {
		SpringApplication.run(XXXApplication.class, args);
	}
}

2.springMVC项目可以直接添加配置文件,通过@Configuration配置Spring容器,通过@EnableRetry启用重试功能

@Configuration
@EnableRetry
public class RetryConfig {
}
3.添加需要进行重试的业务方法,@Retryable对该方法启用重试

@Retryable注解中的参数说明:

  • 1)value:抛出指定异常才会重试(value不为空是,include和exclude不生效)
  • 2)include:指定需要处理的异常,默认为空,当exclude也为空时,所有异常都重试
  • 3)exclude:指定不处理的异常,默认为空,当include也为空时,所有异常都重试
  • 4)maxAttempts:最大重试次数,默认为3,如果要设置的重试次数为3,可以不写; backoff:重试等待策略。
    • delay:等待间隔时间
    • maxDelay:最大等待间隔时间(默认为30s)
    • multiplier:等待间隔时间放大倍数。例如(delay=2000,multiplier=2时,则重试时间为2,4,8,16……,但<=maxDelay值)

例如下图:捕获异常为ResultException, 2秒执行一次,每次递增2倍,最多每10秒执行一次,最多重试60次。

@Retryable(value = ResultException.class, maxAttempts = 60, backoff = @Backoff(delay = 2000L,maxDelay = 10000L, multiplier = 2))
public void test(String testParam) throws ResultException {
    System.out.println(testParam);
    throw new ResultException("抛出指定异常,重试");
}
二、常见问题
1.设置的每60秒执行一次,实际30秒执行一次

原因:没有设置最大等待间隔时间maxDelay(默认为30s)。

2.重试功能没有生效

原因:可能是将重试方法作为内嵌方法调用了(作为内嵌方法调用时不生效)

如下这种方式调用,重试不会生效。
原因是:由于Retryalbe用到了aspect增强,所以会有aspect的坑,就是方法内部调用,会使aspect增强失效,那么Retryalbe当然也会失效。

public class Test{
	public void a(){
		b();
	}
	@Retryalbe
	public void b(){
	}
}

本文完。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值