业务逻辑一定要紧密执行,希望大家引以为戒!——记一次惨痛的教训【伸手党福利】【又是贷款上班的一天】

news2025/1/10 22:25:03

切记一定要先执行业务逻辑再进行其他操作!

程序员的教训

问题现象

后台传来报警,充值平台余额不足,发现大量充值记录。

分析

先看一下代码:

发起http的post请求,然后将返回体显示,并用logs记入日志,之后,将订单提交成功/失败的结果填写入订单表

					HttpResponse<String> response = Unirest.post(aaAgentConfig.getAgentUrl() + "/xxx.php/xxxxx/xxxxxx")
							.header("Content-Type", "application/x-www-form-urlencoded")
							.fields(paramMap2)
							.field("sign", sign)
							.contentType("application/x-www-form-urlencoded")
							.asString();

					System.out.println(response.getBody());
					System.out.println(response.getStatus());
					if(String.valueOf(response.getStatus()).equals("200")){
						logs.add("提交订单成功"+response.getBody());
						addFeeCharges2AaOrder(aaOrders.get(i),"1.已提交充值平台"+response.getBody()+aaAgentConfig.getAgentName()+aaAgentChooseConfig.getChargeName()+"id:"+aaAgentChooseConfig.getChargeId(),"1");

					}else{
						log.info("提交订单失败"+response.getStatus()+response.getBody());
						logs.add("提交订单失败"+response.getStatus()+response.getBody());
						addFeeCharges2AaOrder(aaOrders.get(i),"2.提交失败"+response.getStatus()+response.getBody()+aaAgentConfig.getAgentName()+aaAgentChooseConfig.getChargeName()+"id:"+aaAgentChooseConfig.getChargeId(),"2");

					}

再看报错

在这里插入图片描述
原因是Logs.add会自动提取ip地址,但是定时任务没有请求来源,所以ip地址为空。
但是,在报错后,程序没有崩溃,而是直接终止此请求。但是请求发起后的业务逻辑没有执行
也就是说,在每个定时任务中,都发现有这个订单,但是业务逻辑都没有执行,导致重复充值!

结论

由于用接口调试完程序,直接复制到定时任务当中,发布完就去吃饭了。导致事故发生。

补救

以下处理方法建议都做

  1. 在logs增加判断是否定时任务的函数
  2. 在getIPAddr()函数中增加结果为null的判断
  3. 在定时任务环境中使用专用日志增加函数

由于该充值操作可以撤回,所以赶紧找了充值平台管理员,执行撤回操作。未造成严重经济损失。

教训

  1. 一定要注意业务逻辑的紧密性,不要随便在业务逻辑里面随便插日志!尤其是带有IP地址获取日志这种有使用场景的操作。
  2. 不要蜜汁自信,程序发布直接上线,都不带测试的。

改之后的代码

业务逻辑:

					System.out.println(response.getBody());
					System.out.println(response.getStatus());
					if(String.valueOf(response.getStatus()).equals("200")){
						
						addFeeCharges2AaOrder(aaOrders.get(i),"1.已提交充值平台"+response.getBody()+aaAgentConfig.getAgentName()+aaAgentChooseConfig.getChargeName()+"id:"+aaAgentChooseConfig.getChargeId(),"1");
						logs.add("提交订单成功"+response.getBody());
					}else{
						log.info("提交订单失败"+response.getStatus()+response.getBody());
						
						addFeeCharges2AaOrder(aaOrders.get(i),"2.提交失败"+response.getStatus()+response.getBody()+aaAgentConfig.getAgentName()+aaAgentChooseConfig.getChargeName()+"id:"+aaAgentChooseConfig.getChargeId(),"2");
						logs.add("提交订单失败"+response.getStatus()+response.getBody());
					}

获取ip:

public static String getIpAddr() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        在定时任务等没有ip请求的情况下,调用获取ip地址,造成报错,解决此问题。
        if(request==null){
            return "127.0.0.2";
        }
        //        在定时任务等没有ip请求的情况下,调用获取ip地址,造成报错,解决此问题。-end

修改Logs.add
(这个就不放了)

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

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

相关文章

STM32F4_nRF24L01无线通讯

目录 前言&#xff1a; 1. nRF24L01无线模块简介 2. nRF24L01状态机 3. nRF24L01模式 4. nRF24L01的SPI配置 4.1 nRF24L01 Rx 和 Tx 的初始化配置 4.2 nRF24L01相关寄存器 5. 硬件连接 6. 实验程序 6.1 main.c 6.2 NRF24L01.c 6.3 NRF24L01.h 前言&#xff1a; S…

10-切片是什么?【视频版】

目录 问题视频解答 问题 视频解答 点击观看&#xff1a; 10-切片是什么&#xff1f;

主成分分析系列(二)为何特征向量是主成分

在主成分分析系列&#xff08;一&#xff09;概览及数据为何要中心化这篇文章中介绍了PCA算法的大概想法及数据为何要中心化&#xff0c;在这篇文章具体推导PCA算法的过程。 1. 首先 PCA 最原始的想法是&#xff1a; 设 V \mathbf{V} V 为 d {d} d 维 线性空间&#xff08;即…

单表-DQL

注意&#xff1a;这张图还包含了对于的顺序&#xff0c;先分组再排序&#xff0c;再分页&#xff0c;顺序不能乱 基本查询 # 1.基本查询 # 查询全部行 select * from tb_emp; select id, user_name, password, name, gender, image, job, entry_date, create_time, update_ti…

成本降低60%至70%?中国展现顶级电池技术,锂电就是下一个铅酸

在3月份&#xff0c;宁德时代宣布加速推进钠离子电池产业化&#xff0c;以降低成本并提供差异化产品和技术&#xff0c;帮助客户提升产品竞争力和占据更大市场份额。孚能科技已在上半年开始批量生产钠离子电池&#xff0c;而拓邦股份也在最近的国际电池技术展上发布了自家的钠离…

二、逻辑回归

二、逻辑回归1.线性回归2.分类问题1&#xff09;二分类2&#xff09;多分类 3.逻辑回归模型简介1&#xff09;逻辑回归背景2&#xff09;逻辑回归主要基于以下三个目的3&#xff09;优缺点 4.逻辑回归原理1&#xff09;构造函数&#xff08;Sigmoid函数&#xff09;2&#xff0…

阿里远程仓库环境安装

自己是做前端开发的&#xff0c;自己薅的阿里的三个月的免费的服务器&#xff0c;练练手。在安装环境的时候遇到一些坑&#xff0c;记录下来 获取到服务器之后我是通过Royal TSX工具远程连接的&#xff0c;作为一个前端可能想到先装一些基本的命令 介绍一些基本的命令&#xff…

Git学习笔记(二)

导航小助手 四、分支管理 4.1 管理分支 4.2 创建分支、切换分支、合并分支 4.3 删除分支 4.4 合并冲突 4.5 分支管理策略 4.5.1 分支策略 4.6 bug分支 4.7 删除临时分支 四、分支管理 4.1 管理分支 现在介绍一下Git的杀手级别功能之一&#xff1a;分支~ 理解分支&a…

解决:前端请求跨域问题

解决&#xff1a;前端请求跨域问题 问题一&#xff1a;Access to XMLHttpRequest at https://xxx/ICN40310000075_1687926884828.pdf from origin http://localhost:63342 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requeste…

valgrind检测内存泄漏、越界访问、野指针访问实验

前言 本次测试包括&#xff0c;检测无误的代码&#xff0c;检测内存泄漏&#xff0c;检测访问越界&#xff0c;检测野指针&#xff0c;检测访问已经释放(已经被free)的内存。 一 安装valgrind sudo apt install valgrind 二 无错误 #include <stdio.h> #include <…

leetcode:836. 矩形重叠(python3解法)

难度&#xff1a;简单 矩形以列表 [x1, y1, x2, y2] 的形式表示&#xff0c;其中 (x1, y1) 为左下角的坐标&#xff0c;(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴&#xff0c;左右边平行于 y 轴。 如果相交的面积为 正 &#xff0c;则称两矩形重叠。需要明确的是&…

在图像上绘制图形

1.绘制直线 cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)2.绘制圆形 cv.circle(img, (256, 256), 60, (0, 0, 255), -1) 3.绘制矩形 cv.rectangle(img, (100, 100), (400, 400), (0, 255, 0), 5)4.向图片中添加文字 cv.putText(img, "hello", (100, 150), cv.F…

google浏览器如何把 develop tools 弹窗设置为一个单独界面

更改默认的弹出式窗口和重定向设置 在计算机上打开 Chrome。在右上角&#xff0c;依次点击“更多”图标 设置。依次点击隐私设置和安全性 网站设置 弹出式窗口和重定向。选择要设为默认设置的选项。 管理特定网站的弹出式窗口和重定向 https://support.google.com/ch…

自动备份Windows的环境变量

执行脚本 ECHO OFF set year%date:~6,4% set month%date:~0,2% set day%date:~3,2% set hour%time:~0,2% set minute%time:~3,2% set second%time:~6,2% set backupTime%year%%month%%day%_%hour%%minute%%second% set>>D:/IDE/databack/pc_path/environment-backup-%ba…

【若依项目学习】day1-启动项目

若依开源框架&#xff0c;前后端分离项目&#xff0c;地址&#xff1a;http://doc.ruoyi.vip/ruoyi-vue/ 先配置环境 JDK1.8&#xff0c; MySQL5.7 &#xff0c;Maven3.6&#xff0c;redis、nginx(可以不配)、 node 具体见&#xff1a;https://ygstriver.blog.csdn.net/articl…

windows——【磁盘】C盘又又双叒叕满了,如何清理爆满的C盘

目录 磁盘又满了&#xff0c;咋整&#xff1f;1.初级版本&#xff0c;用windows自带清理工具【没啥用】2.控制面板&#xff0c;清理系统和保留空间【亲测有用】&#xff08;1&#xff09;在控制面板里面点击系统&#xff08;2&#xff09;在系统里面右键 3.直接删除C盘的文件&a…

家政软件是什么,上门预约家政软件有什么功能?

随着人们生活水平的提高和对便利性的需求增加&#xff0c;家政服务市场正呈现出快速增长的趋势。家政软件作为提供便捷、高效家政服务的工具&#xff0c;将成为满足用户需求的重要方式。这将推动家政软件市场的扩大。那么家政软件具体是什么样的一款软件呢&#xff1f; 家政上门…

额度系统,为什么需要有【预占额度】这个操作?

反向思维&#xff0c;若没有额度预占&#xff0c;系统会有什么问题&#xff1f; 没有额度预占 我们知道&#xff0c;额度预占、额度扣减是搭配调用的。这个流程&#xff0c;是在授信完支用期间的&#xff0c;流程如下图&#xff1a; 额度扣减&#xff1a; 核心建立借据成功&…

Vue3+TS+ElementPlus报错集锦

目录 1、导入TS类型报错 2、使用类型报错 3、Vue3引入文件爆红且不提示 4、为defineAsyncComponent引入的component子组件设置类型 5、类型“undefined”不能作为索引类型使用。 6、为props定义类型报错 7、在tsx中调用表单验证方法报错 8、为defineComponent中的props选…

1_5 Occupancy network

1、BEVerse: Unified Perception and Prediction in Birds-Eye-View for Vision-Centric Autonomous Driving 本文不想已经存在的单一任务优化方法&#xff0c;而是构建BEV的时空视频特征并联合推断视觉自动驾驶多任务。之前的任务是目标检测和地图语义分割一起做&#xff0c;之…