回传方案笔记

项目涉及业务系统交互,需要用到回传,饱受折磨后,决定整理一下。

简述

回传不是一个方法,或一个功能。虽然说是功能也没错,但是个复杂的功能或是一套机制更合适。

首先,不只是落库的数据需要回传,有些中间状态的数据也需要回传。这两种情况抓数据的方式不一样。
1、落库的数据。扫表抓数据。
2、中间数据。删除掉就没了,所以需要埋点。

按业务系统、类型来回传。不同业务系统回传的类型不一样,有的不用回传,有的回传这几个,有的回传那几个。

定时任务回传。
建议分开写,因为不同的类型,回传逻辑不一样。

落库的数据不要放到备份表

现有方案:
将需要回传的数据放到备份表中,然后定时扫描备份表进行回传。
这里当初涉及的比较粗糙,落库的数据也放到备份表了,这样有个问题,抓数据的时候容易冗余,两个表关联查询吧,又是没有业务关系的两个表,而且关联太多表sql慢(因为标准逻辑已经有几张关联表了)。

优化方案:
落库的数据干嘛还要放备份表呢? 多此一举。直接用扩展字段标记,然后根据状态回传,避免了冗余数据,省了很多性能。

指定功能固定筛选条件

对于指定功能的方法,条件可以内置固定。
例如:回传已开未回传单据。
条件是固定的,那就在方法里面把这两个条件写死。当然,分页和创建日期可以灵活掌握,接收传参。

这样有个好处,通过方法就可以完全区分功能,甚至在定时任务中也不用控制条件了,直接拿过来方法就行。

之前有个误区,方法写的灵活性太强,筛选条件都在定时任务中设定,那么其实很麻烦,测试也不好测试,例如拿controller来测试,那么多条件,很容易设置错。

回传字段的设计

以下几个字段是可以的。

flag 回传标志 0未回传 1已回传
times 次数(可以设置个域值,例如5次或6次)
message 反馈信息(存放业务系统的反馈,成功或失败原因,也可以存放本地不回传的原因)
txt 回传报文(拼接好的报文,主要便于查看问题)

关于flag是否要多加几个状态

例如:
0 未回传
1 已回传
2 回传失败
3 无需回传

个人感觉没必要,当然状态多筛选的时候条件可以少点,但是之前的处理逻辑就复杂很多,不如直接用flag+times来判断,完全够用了。
这两个条件就够:
and flag !=‘1’
and times<6

筛选条件的定制

这里的筛选条件和常规的不太一样。
例如:常规字段都会判断,test="documentNumber != null and documentNumber != ''
如果想要实现is null的需求,很明显不好用了,所以需要定制标志。

常规sql:

<if test="documentNumber != null and documentNumber != ''">AND t.DOCUMENT_NUMBER = #{documentNumber}
</if>

定制的sql是这样:

<if test="flagNot1Flag != null and flagNot1Flag != '' and flagNot1Flag==true ">AND t2.FLAG  !='1'
</if>

根据实际来吧,需要多少sql就定制多少sql。
但是有一点要注意,同字段sql,无论是定制非定制,只能有一条同时生效。

回传结果兜底落库(后处理)

回传和其他不一样,需要有个feedback对象(反馈对象)贯穿始终,这样好处多多。

为什么这么说呢?
不同于其他功能,例如新增单据,失败了业务终止,返回就行了。

回传如果失败了,不能简单的终止,次数要加1(或做其他标记),否则下次还会查到它。 因此,反馈对象及后处理非常必要。
反馈对象还可以作用到接口调用时反馈结果,因为整个链路太长了。

包括:
单据信息
拼接后的报文
发送后的反馈
后处理等。

如果不加个反馈类,不好排查问题。

回传字段的初始化

如果在同一个表里,那么比较好弄,字段设置默认值为0就行。
如果是在扩展表里,就比较麻烦,因为是通用表,不好给设置默认值。

这时可以通过定时任务实现,
如果flag为空,flag和times都设置为0。

update T_TABLE
set
FLAG= '0',
TIME= '0'
where
FLAG is null

历史数据的初始化

当然还有历史数据的初始化,例如1年前的数据,肯定早回传了。再循环白白浪费资源。

方案:
单表的话,根据单据时间设置状态为1即可。
扩展表的话,先根据单据时间关联查询,拿到id列表,批量更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题笔记 - 滑动窗口

文章目录 滑动窗口最长无重复子串最小覆盖子串串联所有单词的子串长度最小的子数组滑动窗口最大值字符串的排列最小区间 滑动窗口 所有题目来自leetcode的回答&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-d…

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程&#xff0c;从最开始的想法到代码提交的详细记录&#xff0c;有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接&#xff1a;LINK 看题目意思是就是给你一个数X&…

uni-app 安装 uni-app-fetch 进行接口请求的封装

1、在 uni-app 中通过 uni.request 发起网络请求&#xff0c;在实际的应用中需要结合一些业务场景进行二次封装&#xff0c;比如配置 baseURL、拦截器等&#xff0c; 1、uni-app-fetch 是对 uni.request 的封装&#xff0c;通过 npm 来安装该模块 # 安装 uni-app-fetch 模块 …

04.化栈为队

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

MySQL LRU算法(冷热数据分离)

背景 MySQL中使用的InnoDB存储引擎采用了一种特别的最近最少使用&#xff08;LRU, Least Recently Used&#xff09;算法来管理其Buffer Pool中的页&#xff08;包括数据页和索引页&#xff09;。Buffer Pool是InnoDB用来缓存数据&#xff0c;以减少磁盘I/O操作的内存区域。正…

初识C语言——第十一天

操作符&#xff1a; 1. 算数操作符&#xff1a; - * / % 2. 移位操作符&#xff1a; >> &#xff08;右移&#xff09; << &#xff08;左移&#xff09; 移动的是二进制位 例如&#xff1a; int ba<<1; 3. 位操作符&#xff1a; & 按位与 | 按位…

活动预告 | 5月16日 Streaming Lakehouse Meetup · Online 与你相约!

随着 Apache Flink 技术社区的不断成熟和发展&#xff0c;越来越多企业开始利用 Flink 进行流式数据处理&#xff0c;从而提升数据时效性价值&#xff0c;获取业务实时化效果。与此同时&#xff0c;在大数据领域数据湖架构也日益成为新的技术趋势&#xff0c;越来越多企业开始采…

NERF++:Analyzing and Improving Neural Radiance Fields神经辐射场的分析与改进

ABSTRACT 神经辐射场(NeRF)可以实现各种捕获设置的令人印象深刻的视图合成结果&#xff0c;包括360度捕获有界场景和前向捕获有界和无界场景。NeRF 将代表视图不变不透明度和视图相关颜色体积的多层感知器(MLPs)匹配到一组训练图像中&#xff0c;并基于立体渲染技术对新视图进…

nestjs版若依全栈管理后台完全开源!

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生&#xff0c;它的后端采用…

股票退市的最新要求!

五一假期一过&#xff0c;多家上市公司都进入退市名单&#xff0c;不知道有没有您的股票&#xff1f;很多朋友直呼现在炒股越来越难&#xff0c;一步小心就买到了退市个股&#xff0c;加上新改革&#xff0c;我们一起来结合退市政策来了解下怎么挑选个股&#xff1f; 2024年最新…

JAVA队列相关习题4

1. 用队列实现栈。 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 一个队列无法实现栈 尝试使用两个队列 1)push元素的时候应当放在那里&#xff1f;哪个队列不为空就放在哪里 2&#xff09;出栈的时候&#xff0c;出不为空的队列size-1元素&#xff0c;剩余元…

01-new SpringApplication

准备配置Bean Configuration public class TestSpringApplication {static class Bean1 {}static class Bean2 {}static class Bean3 {}Beanpublic Bean2 bean2() {return new Bean2();}Beanpublic TomcatServletWebServerFactory tomcatServletWebServerFactory() {return ne…

去哪找高清视频素材?哪个网站有视频素材?

在这个视觉表达日益重要的时代&#xff0c;获取高品质的视频素材变得尤为关键。4K和无水印视频素材特别受到创作者的青睐&#xff0c;因为它们能极大地提升视觉作品的吸引力和专业度。接下来&#xff0c;我将介绍几个国内外的优秀视频素材网站&#xff0c;助您在创作旅程上一帆…

解决springboot项目的网站静态页面显示不全问题

在通过springboot搭建项目时&#xff0c;为了能够访问静态的前端页面&#xff0c;我们考虑到访问的优先级问题&#xff0c;通常选择将资源放在recourses/static的目录下&#xff0c;如下&#xff1a; 这时可能会出现类似于下面这种图片无法加载、没有按照指定位置显示的情况&am…

代码随想录算法训练营第六十二天|503.下一个更大元素II、 42. 接雨水

单调栈 文章目录 一、下一个更大元素II二、接雨水总结 一、下一个更大元素II 1.数组扩展一倍计算 2.模拟遍历两边nums&#xff0c;用i % nums.size()来操作 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {//暴力解法&#x…

第四十节实现主人公的技能释放功能(二)实现技能按钮

看看我们今天要实现的效果是&#xff0c;当我们按下数字1快捷键&#xff0c;我们的技能按钮会进入倒计时&#xff0c;如下图演示&#xff1a; 一、新建场景和根节点设置 新建场景&#xff0c;选择TextureButton作为根节点&#xff0c;重名为SpellButton&#xff0c;保存场景…

程序员的实用神器——高效软件开发的秘诀

目录 前言 一、自动化测试工具 &#xff08;一&#xff09;常用的自动化测试工具 &#xff08;二&#xff09;编写有效的测试用例的建议 &#xff08;三&#xff09;提高代码覆盖率的方法 二、持续集成/持续部署 &#xff08;一&#xff09;持续集成&#xff08;CI&#…

前端面试题 | new 操作符的原理 |(对象的原型 及其用途)

问题&#xff1a;new操作符具体干了什么&#xff1f; 总结&#xff1a; 在JavaScript中&#xff0c;new操作符 用于创建一个新的对象实例。 作用是 ①创建一个空对象 ②将这个新对象的隐式原型指向构造函数的显式原型 ③它将构造函数的this指向这个新对象&#xff0c;并执行构造…

pyinstaller 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法(详细)

首先我们需要查看是否安装了pyinstaller &#xff0c;可以在命令窗口输入命令pip list检查是否安装成功&#xff0c; 这里我们可以看见已经安装成功了的&#xff0c;如果没有安装可以执行安装命令 pip install pyinstaller 进行安装即可。 下一步我们排查pyinstaller的安装路…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接&#xff0c;那么状态转移方程为&#xff1a; d p [ i ] t r u e &#xff0c;如果存在任意 j ∈ [ 0 , i − 1…