接口调用失败重试方案
目录
- 背景
- 思路
- 定义一个自定义注解
- 定义一个切面
- 测试
- 控制台结果
背景
在项目开发中,有时候会出现接口调用失败,本身调用又是异步的,如果是因为一些网络问题请求超时,总想可以重试几次把任务处理掉。
一些RPC框架,比如dubbo都是有重试机制的,但是并不是每一个项目都会使用dubbo框架,常规的小项目有时候直接使用http进行不同项目之间的交互。
思路
使用spring aop和自定义注解来,建立一套重试机制。
根据切入点和自定义注解,来完成重试工作。
定义一个自定义注解
package com.it.ssm.annotation;import org.springframework.stereotype.Component;import java.lang.annotation.*;@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface RetryProcess {//重试的次数int value() default 1;
}
定义一个切面
package com.it.ssm.annotation;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint;
import org.springframework.stereotype.Component;import java.util.concurrent.atomic.AtomicInteger;@Aspect
@Component
public class AspectExceptionInterceptor {private final Logger logger = LoggerFactory.getLogger(this.getClass());private AtomicInteger atomicInteger = new AtomicInteger(0);@AfterThrowing(pointcut=("execution(* com.it.ssm..*(..)) && @annotation(com.it.ssm.annotation.RetryProcess)"))public void tryAgain(JoinPoint point) {try {Object object = point.getTarget();MethodSignature methodSignature = (MethodSignature) point.getSignature();RetryProcess retryProcess = methodSignature.getMethod().getAnnotation(RetryProcess.class);if (atomicInteger.intValue() < retryProcess.value()) {int i = atomicInteger.incrementAndGet();// 阻塞i秒后再进行重试,如果网络问题立即重试失败几率非常大所以建议阻塞一下再试Thread.sleep(1000 * i);logger.info("开始重试第" + i + "次");MethodInvocationProceedingJoinPoint methodPoint = ((MethodInvocationProceedingJoinPoint) point);// 再次调用方法methodPoint.proceed();}} catch (Throwable throwable) {// 捕获到异常后再次重试tryAgain(point);}}
}
测试
@RetryProcess(value = 3)
@RequestMapping("/testException")
public void testException() throws Exception {// 这里为了方便测试手动抛一个异常,实际此处应该是调用接口逻辑throw new RuntimeException("测试重试异常");
}
控制台结果
接口调用失败重试方案相关推荐
- 外部接口调用失败重试
文章目录 @[toc] 第三方接口调用失败重试 规则 代码 `@MyRetry` `MyRetryFactory` `MyRetryTemplate` `ResponseResult` `ThirdC ...
- java调用接口失败重调_接口调用失败的退避策略
退避策略简介 在开发过程中我们经常会遇到调用接口失败的情况.遇到这种情况,我们有时候需要重试机制,常用的重试(退避)策略有: 固定的时间间隔重试一次,最多重试N次:比如我现在一个接口调用失败了,不是立 ...
- 远程服务调用失败重试之简单实现
一.前言 在业务多.并发高的情况下,我们的系统,一般都会拆分为多个子系统,子系统之前通过 RPC 联系. RPC 调用偶尔会出现失败的问题,而有些问题实际上不是问题,例如只是网络延迟,方法调用超时,再 ...
- 关于百度APIStore提供的接口调用失败问题
最近,由于在自己开发的微信公众账号当中使用到便民服务--天气查询,便申请了百度api的天气预报接口. 按照接口文档写完请求体的代码,在页面通过Struts去请求的时候,页面post方式传递过来的查询条 ...
- 接口调用常见异常处理方案
一个远程服务器会暴露各种各样的对外服务,我们称之为service1 2 3 某个客户端会调用其中某个service,在不出异常的情况下服务可能会很稳定, 但是一旦出现了异常,如果没有良好的异常处理机制 ...
- 微信小程序 授权地理位置被拒绝后 wx.getLocation接口调用失败问题
最近在开发小程序,需要用到位置信息. 但总有那么一小部分人会点击拒接授权,然后小程序就用不了了.因为是根据所在的城市信息来加载数据,所以就需要引导用户自己打开地理位置授权.像下图 废话不多说直接上代码 ...
- 万云网实名认证不成功_头条发文章显示实名认证接口调用失败,无法发送,怎么办才能解决?我实名了的?...
我的是这样显示的,但是我现在的帐号就是这个,我也搞不懂了,我就一个头条号www.shufadashi.com防采集. 1.在手机中点按今日头条app标志,进入今日头条,如图所示.2.进入今日头条之后点 ...
- 部署到服务器后,网付通接口调用失败
解决办法: 造成上述错误的罪魁祸首就是工程文件"属性--生成"中的目标平台造成的,如果选择Any CPU或者x64就会出现上述问题,将它设置为x86,问题得以解决.
- 【Spring Cloud】OpenFeign和Spring Cloud Loadbalancer调用失败后的重试机制比较
1 概述 搭建一个微服务系统,有两个服务,Client和Server,Server有三个实例A.B.C,我让Client调用Server,Loadbalancer负载分担默认采用轮询机制,当Serve ...
最新文章
- 搜狗上线海外权威健康搜索 支持中英双语一键切换
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- STVD下配置Cosmic编译器
- 从索引 0 处开始,初始化字符串的格式不符合规范。
- 聊聊如何设计千万级吞吐量的.Net Core网络通信!
- 12.15模拟:总结
- 大端字节序码流中取出2字节_产生字节码
- 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
- 活动目录管理之批量创建域用户
- 最新StrongShop跨境电商系统源码+支持多语言
- 低通滤波器转带通滤波器公式由来_无源滤波器应用或电路中的带通滤波器原理...
- python获取excel数据制作有文字和图表的报告_Python实现从excel读取数据并绘制成精美图像...
- java timer缺陷
- day55 虚拟机 centos linux命令 搭建linux架构师必背命令
- 二维码制作方法有哪些?教你简单的二维码制作方法
- 计算捐款总量 (10 分)
- 几大厂商的hypervisors比较分析
- indesign页眉如何左右分布_InDesign排版技巧
- 施一公首部作品:《自我突围:向理想前行》
- 阿里云 mysql tps_MySQL_tps
热门文章
- 从苏宁电器到卡巴斯基(第二部)第12篇:我在卡巴的日子 XII
- idea手动打包Docker部署linux
- 北大和人大两年整理出来的书单(经济&管理&商业)
- 自己写php模板引擎,如何用php编写一个简单的模板引擎(附代码)
- 系统试运行报告是谁写的_祝贺!杭联热电超高压高温背压机组168小时试运行圆满成功~...
- 打字标准 / 打字键位 / 打字速度提升
- 华为Datacom:认识网络设备
- 如何用C语言编写学生选修课程系统?
- 10. 查询选修了1号课程的学生及其选修课程的情况,保留学生学号,姓名,课程名,成绩
- C语言中的数据类型及相关数据操作