小垃圾写的一个保证幂等性的接口,希望大家看了可以提出意见

背景介绍 这个接口的背景是这样的,tms(运输管理系统)会下发出库任务给我们的系统,我们的系统是wms(仓库管理系统),一个调度单会调用一个我们的接口一次。一个调度单里面会有很多的包件,一辆车上会有很多的调度单,一个月台(可以理解为仓库前面的停车装货的地方),一次发货会发几个月台的数据。对面是开启并发来调用我这个接口的,并发量大概一瞬间最高的时候可能会有300左右。

业务流程介绍 首先会把接收到的数据插入到接口表中(接口入参如下),headers中的每条数据都会插入一条数据

然后开启异步线程,判断传参中headerDTO承运商(vendorCode)在承运商表是否存在,不存在的话需要插入A库和B库。插入B库的时候时使用db_link,最后把集合headers中的每条数据都插入到发货头表中。

具体代码 把所有的参数校验放在最前面(因为最开始对接口的时候字段和全局返回的字段不一样,这个报错只能自己手写),校验的字段太多,截图没有截全。

幂等性校验

我这里是在数据库里面加了调度单Id(departId)的唯一索引。如果有这个这个调度单了直接返回成功。这里我理解,单个插入和批量插入应该都是可以这样做的。各位大佬如果看了觉得有问题可以提醒一下小弟。

然后开启异步线程执行后面的插入承运商和发货计划 插入承运商表,这里因为需要根据每个的订单ID去查订单,然后还要查工厂,为了省事,这里就直接在循环中国写插入的sql。

插入承运商的时候是调用的一个已经写好的存储过程

先查询有没有,没有就使用db_link两个数据库都会插入一条数据,这里db_link会非常慢,这里会导致接口超时,这也是我使用异步的原因。

接下来就是插入接口头表,因为我需要把每条数据插入的失败的原因写入到数据库的接口表中(使用attribute9和10来表示插入是否成功,以及失败的原因,方便到时候人工介入。所以我能想到的就是循环里面写sql去插入。然后通过try catch去驳货插入发货头表失败的原因然后写入到接口表中,表示这条数据插入失败,然后人工介入)

以上就是所有的流程了。我感觉这样能够满足幂等性,然后还能提高接口的效率。可能还有很多不完善的地方。希望各位比我还新手的人能够得到借鉴,然后能够比我写的好很多,我扪心自问觉得自己写的这个比较垃圾。希望能够得到各位优秀的程序员的指点。

相关推荐
程序员飞哥9 小时前
重构 AI 思维(一):Prompt Engineering,如何下达不可违抗的指令?
人工智能·后端
皮皮林55110 小时前
@Autowired 和 @Resource 注解有啥区别?你这项目怎么还混着用呢?
后端
程序员小假11 小时前
HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·后端
wangbing112511 小时前
踩坑:el8应用装在el9上
开发语言·后端·ruby
kyriewen1112 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
IT_陈寒12 小时前
SpringBoot自动配置坑了我,原来要这样绕过去
前端·人工智能·后端
东方小月13 小时前
Claude Code 完整上手指南:MCP、Skills、第三方模型配置一次搞定
前端·人工智能·后端
凤山老林13 小时前
从0到1搭建企业级权限管理系统:Spring Boot + JWT + RBAC实战指南
java·spring boot·后端·权限管理·rbac
ray_liang13 小时前
吐血整理JSON-RPC2.0的原理与应用
后端
蝎子莱莱爱打怪13 小时前
Claude Code 省 Token 小妙招:RTK + Caveman 组合拳
前端·人工智能·后端