目录

  • 背景
  • 思路
    • 定义一个自定义注解
    • 定义一个切面
    • 测试
    • 控制台结果

背景

在项目开发中,有时候会出现接口调用失败,本身调用又是异步的,如果是因为一些网络问题请求超时,总想可以重试几次把任务处理掉。

一些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("测试重试异常");
}

控制台结果

接口调用失败重试方案相关推荐

  1. 外部接口调用失败重试

    文章目录 @[toc] 第三方接口调用失败重试 规则 代码 `@MyRetry` `MyRetryFactory` `MyRetryTemplate` `ResponseResult` `ThirdC ...

  2. java调用接口失败重调_接口调用失败的退避策略

    退避策略简介 在开发过程中我们经常会遇到调用接口失败的情况.遇到这种情况,我们有时候需要重试机制,常用的重试(退避)策略有: 固定的时间间隔重试一次,最多重试N次:比如我现在一个接口调用失败了,不是立 ...

  3. 远程服务调用失败重试之简单实现

    一.前言 在业务多.并发高的情况下,我们的系统,一般都会拆分为多个子系统,子系统之前通过 RPC 联系. RPC 调用偶尔会出现失败的问题,而有些问题实际上不是问题,例如只是网络延迟,方法调用超时,再 ...

  4. 关于百度APIStore提供的接口调用失败问题

    最近,由于在自己开发的微信公众账号当中使用到便民服务--天气查询,便申请了百度api的天气预报接口. 按照接口文档写完请求体的代码,在页面通过Struts去请求的时候,页面post方式传递过来的查询条 ...

  5. 接口调用常见异常处理方案

    一个远程服务器会暴露各种各样的对外服务,我们称之为service1 2 3 某个客户端会调用其中某个service,在不出异常的情况下服务可能会很稳定, 但是一旦出现了异常,如果没有良好的异常处理机制 ...

  6. 微信小程序 授权地理位置被拒绝后 wx.getLocation接口调用失败问题

    最近在开发小程序,需要用到位置信息. 但总有那么一小部分人会点击拒接授权,然后小程序就用不了了.因为是根据所在的城市信息来加载数据,所以就需要引导用户自己打开地理位置授权.像下图 废话不多说直接上代码 ...

  7. 万云网实名认证不成功_头条发文章显示实名认证接口调用失败,无法发送,怎么办才能解决?我实名了的?...

    我的是这样显示的,但是我现在的帐号就是这个,我也搞不懂了,我就一个头条号www.shufadashi.com防采集. 1.在手机中点按今日头条app标志,进入今日头条,如图所示.2.进入今日头条之后点 ...

  8. 部署到服务器后,网付通接口调用失败

    解决办法: 造成上述错误的罪魁祸首就是工程文件"属性--生成"中的目标平台造成的,如果选择Any CPU或者x64就会出现上述问题,将它设置为x86,问题得以解决. 

  9. 【Spring Cloud】OpenFeign和Spring Cloud Loadbalancer调用失败后的重试机制比较

    1 概述 搭建一个微服务系统,有两个服务,Client和Server,Server有三个实例A.B.C,我让Client调用Server,Loadbalancer负载分担默认采用轮询机制,当Serve ...

最新文章

  1. 搜狗上线海外权威健康搜索 支持中英双语一键切换
  2. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
  3. STVD下配置Cosmic编译器
  4. 从索引 0 处开始,初始化字符串的格式不符合规范。
  5. 聊聊如何设计千万级吞吐量的.Net Core网络通信!
  6. 12.15模拟:总结
  7. 大端字节序码流中取出2字节_产生字节码
  8. 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
  9. 活动目录管理之批量创建域用户
  10. 最新StrongShop跨境电商系统源码+支持多语言
  11. 低通滤波器转带通滤波器公式由来_无源滤波器应用或电路中的带通滤波器原理...
  12. python获取excel数据制作有文字和图表的报告_Python实现从excel读取数据并绘制成精美图像...
  13. java timer缺陷
  14. day55 虚拟机 centos linux命令 搭建linux架构师必背命令
  15. 二维码制作方法有哪些?教你简单的二维码制作方法
  16. 计算捐款总量 (10 分)
  17. 几大厂商的hypervisors比较分析
  18. indesign页眉如何左右分布_InDesign排版技巧
  19. 施一公首部作品:《自我突围:向理想前行》
  20. 阿里云 mysql tps_MySQL_tps

热门文章

  1. 从苏宁电器到卡巴斯基(第二部)第12篇:我在卡巴的日子 XII
  2. idea手动打包Docker部署linux
  3. 北大和人大两年整理出来的书单(经济&管理&商业)
  4. 自己写php模板引擎,如何用php编写一个简单的模板引擎(附代码)
  5. 系统试运行报告是谁写的_祝贺!杭联热电超高压高温背压机组168小时试运行圆满成功~...
  6. 打字标准 / 打字键位 / 打字速度提升
  7. 华为Datacom:认识网络设备
  8. 如何用C语言编写学生选修课程系统?
  9. 10. 查询选修了1号课程的学生及其选修课程的情况,保留学生学号,姓名,课程名,成绩
  10. C语言中的数据类型及相关数据操作