首页 > 其他分享 >记一次Spring retry的使用

记一次Spring retry的使用

时间:2024-01-25 21:35:12浏览次数:27  
标签:retry webservice Spring 代码 异常 一次 推送 数据

问题背景

调用三方平台接口 偶尔会访问不到,导致了逻辑错误

具体描述
  1. 由于工作职责重新划分,我新接手维护了一个项目,这个项目已经开发完成,项目中需要和第三方平台进行对接,主要是我方向对方推送数据

  2. 但是刚接手没几天,实施同事就反馈过来一个问题,我们推送过去的数据在对方那边显示重复了,同一笔数据有好几条

  3. 和同事沟通知道了这个问题之前就出现过,算是一个疑难问题,之前有临时解决方案,我就先临时处理了

解决思路
  1. 那么该如何彻底解决这个疑难问题呢,我开始仔细读相关的代码,读了几遍 已经看懂代码的意思,按照代码逻辑理论上 不会有问题,原代码考虑的比较全面了

  2. 代码中找不出问题,我开始根据出错时间查日志,果然发现了一个异常

Failed to create service. 
at org.apache.cxf.jaxws.ServiceImpl.initialize

和对方之间的通信是用的 webservice技术,但是这个webservice会偶尔访问不到, 通过对比日志和代码,发现这个异常代码里并没有预判到,而是异常向上抛出了,并导致了一系列问题,比较重要的是 影响了数据库事务提交, 由于事务没提交,一部分数据实际已经推送,导致被误认为未推送,下一次推送时进行了重新推送,最终导致了数据重复现象

具体办法
  1. 我第一时间想到的方式是 catch住这个异常,不要向上抛出异常,起码保证数据库事务正常提交。这种思路 不会影响其他数据推送,只影响极少部分的数据, 但是仔细想想可能会出现 数据漏推的问题

  2. 那么有没有更好的方式解决这个问题呢,我又想到了重试机制:如果一次失败,就多试几次。 根据日志排查发现webservice只是偶尔访问不到,相同时间点附近是有成功访问到的, 那么重试时就很有可能会成功。

  3. 基本确定思路后,怎么写代码呢,我想到了Spring retry组件, 我之前用过一次这个组件,也写过一个文档记录如何使用,包括最近看《左耳听风》大神也提到了这个组件。于是很快编写了代码,主要逻辑是 尝试重试5次,每隔2s执行一次, 如果5次后依然有问题就给我发个异常通知,我再手动处理。经过测试环境测试结果符合预期,现在已经开始上线运行。

思考和延伸

编写代码时,我很快就完成了编写,并没有费什么劲,我觉得要归功于之前记录的一个文档,更加体会到日常记录文档的好处。

标签:retry,webservice,Spring,代码,异常,一次,推送,数据
From: https://www.cnblogs.com/hichanglong/p/17988221

相关文章

  • Spring Task定时任务
    任务调度任务调度是为了让系统自动完成任务,在约定好的特定时刻去执行任务的过程列如:在电商系统中需要在下午6点自动发送优惠卷订票系统中根据车次不同,不同时间段分批发票实现任务调度方法多线程方式,利用sleepJDK提供的API:列如Timer,ScheduledExecutor列如Quartzspring......
  • SpringBoot 接口数据加解密解说,你的系统真的安全吗?
    xx项目有于安全问题,需要对接口整体进行加密处理,额,摸摸头上飘摇着而稀疏的长发,感觉我爱了。和产品、前端同学对外需求后,梳理了相关技术方案,主要的需求点如下:尽量少改动,不影响之前的业务逻辑;考虑到时间紧迫性,可采用对称性加密方式,服务需要对接安卓、IOS、H5三端,另外考虑到H5端存储密......
  • 三、SpringCloud Alibaba之Ribbon
    3.1、负载均衡介绍单台服务器不管好好坏总是会遇到性能瓶颈,而解决单台服务器瓶颈方式就是采用集群。高性能集群的本质很简单,通过增加更多的服务器来提升系统整体的计算能力。在一个集群中,每一台服务器提供的功能是一样,但是每一台服务器的类型可能是不一样的(性能、配置、价格等等),......
  • Spring Boot框架actuator配置不当漏洞
    漏洞描述【安全预警】ApacheDubbo远程代码执行漏洞、SpringBoot配置不当及微软1月补丁漏洞部分网站数据库存在SpringBoot配置不当漏洞,利用网站数据库SpringBoot漏洞可读取Redis数据库用户名和密码。连接数据库可查询掌握运维综合服务平台管理员口令哈希。漏洞等级......
  • SpringBoot 依赖管理机制
     依赖管理机制思考:1、为什么导入starter-web所有相关依赖都导入进来?开发什么场景,导入什么场景启动器。maven依赖传递原则。     A依赖B B依赖C:   导入A就拥有B和C导入场景启动器。场景启动器自动把这个场景的所有核心依赖全部导入进来2、为什么版......
  • 7.spring mongo
    配置MongoRepository可以根据实体中的字段,自己进行组合查询,创建一个继承MongoRepository的接口,在该接口中定义方法示例实体类importlombok.Getter;importlombok.Setter;importorg.bson.types.ObjectId;importorg.springframework.data.annotation.Id;importorg.......
  • 记一次使用蓝叠模拟器连接Unity profiler的经历
    由于游戏存在卡顿,且在电脑上editor模式下的测试可能不够正确,于是计划在安卓模拟器中使用profiler工具但是profiler还没用,就被拦在连接这一步。好,让我们去看文档第一步:切换这个我想要去切换的文档中所说的这个档位时——unity似乎没有并什么动作,不明所以的我还以为是卡住了,......
  • spring boot lombok插件
    Lombok集成首先我们需要在IDEA中安装好Lombok插件,如果你使用的是最新版IDEA2020.3,则Lombok插件已经内置,无需安装。 之后在项目的pom.xml文件中添加Lombok依赖,SpringBoot2.1.x版本后无需指定Lombok版本,SpringBoot在spring-boot-dependencies中已经内置。<!--lombok依赖--><......
  • Spring的事务使用教程
    什么是事务?事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败。事务四个特性(ACID)原子性一组操作要么都成功,要么都失败。一致性一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。隔离性事务1......
  • SpringBoot:Springboot整合Mqtt并处理问题
    搭建mqtt服务Docker搭建MQTT服务:https://www.cnblogs.com/nhdlb/p/17960641项目结构这是我的项目结构,主要有两个模块base-modules(业务模块)、base-utils(工具模块)组成,其中base-mqtt服务为工具模块,用于提供给其他业务模块引用依赖的。base-mqtt模块pom.xml这里我的Sprin......