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

背景介绍 这个接口的背景是这样的,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去驳货插入发货头表失败的原因然后写入到接口表中,表示这条数据插入失败,然后人工介入)

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

相关推荐
菠萝崽.1 小时前
RabbitMQ高级篇-MQ的可靠性
java·分布式·后端·消息队列·rabbitmq·异步编程
键盘客5 小时前
Spring Boot 配置明文密码加密,防泄漏
java·spring boot·后端·spring
程序员爱钓鱼6 小时前
defer关键字:延迟调用机制-《Go语言实战指南》
开发语言·后端·golang
集成显卡7 小时前
网页 H5 微应用接入钉钉自动登录
前端·后端·钉钉
fashia8 小时前
Java转Go日记(三十九):Gorm查询
开发语言·后端·golang·go
Kookoos10 小时前
使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务
后端·c#·.net·.netcore·minio·blob
蒂法就是我11 小时前
Spring的后置处理器是干什么用的?扩展点又是什么?
java·后端·spring
CodeLinghu11 小时前
宝塔面板部署前后端项目SpringBoot+Vue2
java·spring boot·后端
嘵奇13 小时前
Spring Boot中Redis序列化配置详解
spring boot·redis·后端
黄暄15 小时前
Linux项目部署全攻略:从环境搭建到前后端部署实战
java·linux·运维·服务器·前端·后端·持续部署