写点什么

Springboot 整合 Retry 实现重试机制

  • 2021 年 11 月 11 日
  • 本文字数:1807 字

    阅读完需:约 6 分钟

</build>


</project>


然后创建一个测试重试的 TestRetryService.java:


/**


  • @Author : JCccc

  • @CreateTime : 2019/8/16

  • @Description :


**/


public interface TestRetryService {


int dignifiedTest(int code) throws Exception;


}


然后是 TestRetryServiceImpl.java:


import com.mail.elegant.service.TestRetryService;


import org.springframework.retry.annotation.Backoff;


import org.springframework.retry.annotation.Recover;


import org.springframework.retry.annotation.Retryable;


import org.springframework.stereotype.Service;


import java.time.LocalTime;


/**


  • @Author : JCccc

  • @CreateTime : 2019/8/16

  • @Description :


**/


@Service


public class TestRetryServiceImpl implements TestRetryService {


@Override


@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))


public int dignifiedTest(int code) throws Exception{


System.out.println("dignifiedTest 被调用,时间:"+LocalTime.now());


if (code==0){


throw new Exception("情况不对头!");


}


System.out.println("dignifiedTest 被调用,情况对头了!");


return 200;


}


@Recover


public int recover(Exception e){


System.out.println("回调方法执行!!!!");


//记日志到数据库 或者调用其余的方法


return 400;


}


}


到这里,已经整合完毕,最后剩下测试了,在测试前,我们先一起来看看代码里面的关键信息的意义:


可以看到代码里面,这个方法上面加上了注解?,


@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5,maxDelay=360000L))


@Retryable : 注解方式标记当前方法会使用重试机制


里面的 value: 重试的触发机制,当遇到 Exception 异常的时候,触发;


maxAttempts: 重试的次数(包括第一次调用,也就是说如果设置 3 次,调用一次后,如果一直失败触发重试,那么还当前方法还会调用 2 次);


delay:重试的延迟时间,也就是距离上一次重试方法调用的间隔,单位毫秒


multiplier: delay 间隔时间的倍数,也就是说,第一次重试间隔如果是 2000ms,那第二次重试的时候就是 2000ms 乘以这个倍数 1.5,就是 3000ms;


maxDelay:重试次数之间的最大时间间隔,默认为 0,即忽略,如果小于 delay 的设置,则默认为 30000L;


再来看下面的这个小方法:


@Recover


public int recover(Exception e){


System.out.println("回调方法执行!!!!");


//记日志到数据库 或者调用其余的方法


return 400;


}


这个方法用到了**@Recover**,也就是用注解方式标记当期方法为回调方法,可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个 Exception e 通知触发这个回调方法)。


PS:该回调方法与重试方法写在同一个实现类里面。


然后在启动类加上开启重试注解:




@EnableRetry


好了,基本简单讲解完毕,接下来测试看看什么效果,


创建一个 TestController.java ,写过简单的测试方法:


import com.mail.elegant.service.TestRetryService;


import org.springframework.beans.factory.annotation.Autowired;


import org.springframework.web.bind.annotation.GetMapping;


import org.springframework.web.bind.annotation.RestController;


/**


  • @Author : JCccc

  • @CreateTime : 2019/8/16

  • @Description :


**/


@RestController


public class TestController {


@Autowired


TestRetryService testRetryServiceImpl;


@GetMapping("/testRetry")


public String testRetry() throws Exception {


int code=0;


int result = testRetryServiceImpl.dignifiedTest(code);


return "result:"+result;


}


}


我们这个测试模拟的场景是,传值 code,一直是 0;然后业务方法判断如果是 0,代表业务不通,失败(网络波动了或者是等等),然后就是触发重试,最后如果重试几次都不成功,然后调用回调方法(可以进行日志记录或者调用其他业务方法等等)。


我们调用接口看看效果:


![](https://img-blog.csdni


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


mg.cn/2019081613462220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw,size_16,color_FFFFFF,t_70)


接口返回了 400,是回调方法返回的:



看看控制台输出情况:



OK,到此,重试整合及测试已经完毕。

评论

发布
暂无评论
Springboot 整合Retry 实现重试机制