基于springboot整合spring-retry
1、背景
本系统调用外围系统接口(http+json),但是发现有时外围系统服务不太稳定,有时候会出现返回一串xml或者gateway bad的信息,导致调用失败,基于这一原因,采用基于springboot,整合spring-retry的重试机制到系统工程中,demo已经放到github上。
2、解决方案
简要说明:demo工程基于springboot,为了方便验证,采用swagger进行测试验证。
2.1 pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.laowang</groupId><artifactId>springretry</artifactId><version>0.0.1-SNAPSHOT</version><name>springretry</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--retry--><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
重点说明:aop的gav必须有,否则会跑不起来。
<!--retry--><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency>
2.2 applicat启动类
package com.laowang.springretry;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableRetry
@EnableSwagger2
@SpringBootApplication
public class SpringretryApplication {public static void main(String[] args) {SpringApplication.run(SpringretryApplication.class, args);}
}
说明:两个标签而已
@EnableRetry
@EnableSwagger2
2.3 controller类
/*** @description: TODO* @author Administrator* @date 2021/6/2 14:55* @version 1.0*/
package com.laowang.springretry.controller;
import com.laowang.springretry.service.RetryService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@Api("重试测试类")
@RestController
public class RetryController {@AutowiredRetryService retryService;@GetMapping("/testRetry")public String testRetry(int code) throws Exception {int result = retryService.retryTest(code);return "result:" + result;}
}
2.4 service测试类(重点)
/*** @description: TODO* @author Administrator* @date 2021/6/2 12:23* @version 1.0*/
package com.laowang.springretry.service;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;@Service
public class RetryServiceImpl implements RetryService {@Override@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))public int retryTest(int code) throws Exception {System.out.println("retryTest被调用,时间:" + LocalTime.now());if (code == 0) {throw new Exception("异常抛出!");}System.out.println("retryTest被调用,情况对头了!");return 200;}@Recoverpublic int recover(Exception e) {System.out.println("回调方法执行,可以记录日志到数据库!!!!");//记日志到数据库 或者调用其余的方法return 400;}
}
**说明:**三个标签
@Retryable注解
被注解的方法发生异常时会重试
value:指定发生的异常进行重试
include:和value一样,默认空,当exclude也为空时,所有异常都重试
exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试
maxAttemps:重试次数,默认3
backoff:重试补偿机制,默认没有
@Backoff注解说明
delay:指定延迟后重试
multiplier:指定延迟的倍数,比如delay=2000,multiplier=1.5时,第二次重试与第一次执行间隔:2秒;第三次重试与第二次重试间隔:3秒;第四次重试与第三次重试间隔:4.5秒。。。
@Recover
当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调
2.5 项目启动
执行运行application,启动成功,默认端口号:8080
2.6 使用swagger进行验证
(1)swagger访问地址:
http://localhost:8080/swagger-ui.html
(2)先验证成功返回
先测试正常调用试试,code=1
调用返回:
(3)重试机制:code=0(重点)
为了更好的说明问题,参数配置增大一些:
@Retryable(value = Exception.class, maxAttempts = 5, backoff = @Backoff(delay = 2000, multiplier = 2))
执行效果
说明:
从执行效果看,总共执行5次,第二次跟第一次之间是2秒;第三次跟第二次之间是2*2=4秒;第四次与第三次之间是:2 乘以2乘以2=8秒,第五次与第四次之间是:2 乘以2乘以2乘以2=16秒,符合预期。
执行完成后,进入 @Recover标签内容,可以进行日志记录,以便后续定位问题。
github项目地址:
https://github.com/ruanjianlaowang/springretry
更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。
基于springboot整合spring-retry相关推荐
- 八、springboot整合Spring Security
springboot整合Spring Security 简介 Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架.它是保护基于Spring的应用程序的事实标准. Spr ...
- springboot整合spring @Cache和Redis
转载自 springboot整合spring @Cache和Redis spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: @Cacheable:触发缓存写入. @ ...
- springBoot整合spring security+JWT实现单点登录与权限管理前后端分离
在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理. ...
- springBoot整合spring security+JWT实现单点登录与权限管理前后端分离--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- SpringBoot整合Spring Data Elasticsearch
特点: 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心) Restful风格,一切API都遵循Rest原则,容易上手 近实时搜索,数据更新在Elasticsear ...
- SpringBoot 整合 Spring Security 实现安全认证【SpringBoot系列9】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...
- SpringBoot整合Spring Security【超详细教程】
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/Lee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 Spring Security是一个 ...
- 基于Springboot整合RestTemplate调用Webservice接口
1.基于Springboot整合RestTemplate调用Webservice接口,如果感觉使用webservice客户端调用服务器端不会,或者不方便 的时候,可以尝试使用RestTemplate来 ...
- springboot整合spring Cache(redis)
前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 阅读前推荐先阅读:redis缓存介 ...
最新文章
- 《Decoupling Representation and Classifier》笔记
- 2013 全国高校计算机等级考试(广西考区)一级笔试试题,全国高校计算机等级考试(广西考区)一级笔试试题卷.PDF...
- dfs入门排列数字问题(一看就懂的讲解)
- *p++和*++p_2020年P气瓶充装新版试题及P气瓶充装找答案
- python开发讲解_Python开发系列课程(1) - 初识Python详解
- @Service @Autowired
- bios文件查看工具_“主板BIOS教程”手把手教你刷bios,多种bios教程
- 2021年11月国产数据库排行榜:openGauss闯入前三,Kingbase流行度与日俱增,TDengine厚积薄发
- C++类的成员变量和成员函数的介绍
- apexsql使用方法_使用ApexSQL审核执行SQL Server审核
- linux下大于2T的硬盘使用方法
- DICOM医学图像处理:Orthanc Plugin SDK实现WADO服务
- python初学者学用anaconda学_致Python初学者:Anaconda入门使用指南
- 鹏业安装算量软件按桥架快速布线
- 50个直击灵魂的问题_短不短,是一个直击灵魂的问题~
- matlab里面box on啥意思,image – Matlab图片中的Box on和axis坐标
- 深圳旅游區景點及簡介
- Python学习八:pip 最常用命令、pip升级、pip 清华大学开源软件镜像站、Python日期和时间(Time模块、日历(Calendar)模块)
- 10.31周报-人体姿态估计CPN
- 如何在JMeter负载测试中模拟不同的网络速度