spring boot使用@Retryable来进行重处理

  1. 应用场景
    发送消息失败,调用远程服务失败,争抢锁失败等
    发消息后其他系统要处理,不知道接到消息会是什么时间。接到的消息需要监听rabbit MQ的队列取出数据。然后把所有消息都放到redis中,需要哪个消息就去取,取回来后再在redis中把取到的消息删掉。

  2. pom引用

<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.3.0</version>
</dependency>
  1. 启动类或者配置类上加@EnableRetry注解,启用这个功能
    与定时任务类似,重试的默认开关是关闭的,需要开启下这个功能@EnableRetry:开启重试功能
@EnableScheduling
@EnableRetry
@SpringBootApplication
public class HelloApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }

}
  1. 在指定方法上标记@Retryable来开启重试
    value:当出现这种异常时,进行重试
    maxAttempts:尝试次数 默认是3次
    backoff:重试补偿机制,默认没有。可以指定暂停时间
    multiplier :(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
    exclude:指定不处理的异常
    include:和value一样,默认为空,当exclude也为空时,默认所有异常
@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))   
 public String getSendMsgFromRedis(String redisKey,String uuid) throws Exception {
	logger.info(*****getSendMsgFromRedis start******);
	String data=(String)redisTemplate.opsForHash().get(redisKey,uuid);
	if(null==data){
		throw new Exception("未查到数据")
	}
	return data;
};

@Retryable注解使用需要注意的地方:
1.由于是基于AOP实现,所以不支持类里自调用方法
2.如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void
3.方法内不能使用try catch,只能往外抛异常
4. @Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring @Retryable注解是一种在Spring框架中实现重试机制的解决方案。这个解决方案的主要思想是在方法发生异常时,让这个方法新执行一次或多次,直到方法成功执行为止。这个方案可以让开发者在开发过程中减少一定的错误处理代码的编写,同时还可以增加系统的可靠性和鲁棒性。 使用Spring @Retryable注解的方法必须满足一定的条件,首先他必须存在于一个Spring管理的Bean中,其次必须有异常抛出。@Retryable注解可以指定重试的次数,每次重试间隔时间,重试的异常条件等等。这些参数可以根据开发者的需要进行深度定制,以实现更加灵活的重试行为。 @Retryable注解处理方式是在Spring框架中通过AOP(面向切面编程)来进行的。具体的实现方式是,在AOP中拦截所有的方法调用,当被拦截的方法抛出指定的异常时,AOP会将这个异常交给重试拦截器进行处理,在处理过程中,重试拦截器会根据开发者指定的参数进行重试操作,并在重试次数达到上限后将异常抛回给方法调用者。 总的来说,Spring @Retryable注解提供了一种简单有效的处理异常情况的解决方案。在实际开发过程中,经常会遇到一些类似网络延迟、数据库访问失败等问题,这些问题往往需要程序员进行手动处理,而使用@Retryable注解可以让我们简化这种操作,提高程序的鲁棒性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值