记一次Spring retry的使用

问题背景

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

具体描述
  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次后依然有问题就给我发个异常通知,我再手动处理。经过测试环境测试结果符合预期,现在已经开始上线运行。

思考和延伸

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

posted @ 2024-01-25 21:28  changlong2022  阅读(28)  评论(0编辑  收藏  举报