前言

本篇文章是学习B站黑马程序员苍穹外卖的学习笔记📑。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,用户端开发的流程大致为用户登录—商品浏览(其中涉及到缓存,之前写过)—添加/查看/清空购物车—下单支付(到现在没搞懂😵‍💫)—地址簿—订单查询/超时/取消处理(巨多)…还有我没学到的🤪🤪

从订单支付这里,一直到day10,要不是很难的看不懂的,要不就是一些之前学过的,我是直接根据课程资料将代码导入,然后稍微看了看逻辑(太多太难了边学边做总结吧)。

🤔如果用户下单但一直不支付,这时就需要我们设置一定的时间,定时清理掉(既然不给钱,那我直接把你轰出去😡)。

🔍下面来看看订单状态定时处理功能的开发

1. 🙌先来了解一下Spring Task 和 Tack_cron表达式

Spring Task 是 Spring 框架提供的一个轻量级的任务调度模块,它允许你在 Spring 应用中简单地配置和执行定时任务。使用 Spring Task,你可以通过注解或者 XML 配置的方式定义定时任务,无需引入额外的库或依赖复杂的配置。(这个是ai给我的概念,我看着也有点懵🤪)

✅你可以把它理解成 手机里的“闹钟”App,只不过它是给你的 Java 程序用的。

你想让程序:每次下单后15分支不付款,就清除订单
只要告诉 Spring Task:“到时间就帮我做这件事”,它就会乖乖地按时执行。

cron表达式是一个字符串,通过cron表达式可以定义任务触发的时间。
一条 cron 任务的基本格式如下:

┌───────────── 分钟 (0 - 59)
│ ┌──────────── 小时 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌────────────── 月份 (1 - 12)
│ │ │ │ ┌─────────────── 星期几 (0 - 6)07 都表示周日)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
*   *   *   *   *   要执行的命令

常用符号说明:

在这里插入图片描述
🙌例:
0 0 * * * /backup.sh :每天零点执行 /backup.sh

*/10 * * * * /ping.sh:每 10 分钟执行一次

30 8 * * 1-5 /check.log:周一到周五早上 8:30 执行

✨注:可以直接用工具生成(更方便):奇Q在线Cron表达式生成器

2. 下面来举个例子来看看它是怎么使用的

①导入maven

启动类添加注解@EnableScheduling开启任务调度

③自定义定时任务类

package com.sky.task;
...
/*** 自定义定时任务*/@Component
@Slf4j
public class MyTask {/*** 定时任务1*/@Scheduled(cron = "0/5 * * * * ?")public void executeTask(){log.info("定时任务1开始执行:{}", new Date());}}

运行后:控制台每5秒输出一次
在这里插入图片描述

🧠最后来看看在实际项目中怎么使用:

先来看看要实现的功能:

  1. 处理超时订单:15分钟未支付,取消订单
  2. 每天凌晨1点处理一直处于派送中的订单

🔍✌️下面来看看代码:
就是结合刚刚学的内容,多加了两个注解和一个 select 语句(查询符合条件的订单再对其进行更改):

在sky-server的task包(P125创建的)下创建一个OrderTask类:

package com.sky.task;
.../*** 订单定时任务*/@Component
@Slf4j
public class OrderTask {@Autowiredprivate OrderMapper orderMapper;/*** 处理超时订单**/@Scheduled(cron = "0 * * * * ? ") // 每分钟执行一次//@Scheduled(cron = "1/5 * * * * ?")public void processTimeOutOrder(){log.info(" 定时处理超时订单:{}", LocalDateTime.now());LocalDateTime time = LocalDateTime.now().plusMinutes(-15);List<Orders> orderList = orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);if(orderList != null && orderList.size() > 0){for (Orders orders : orderList) {orders.setStatus(Orders.CANCELLED);orders.setCancelReason("支付超时,自动取消");orders.setCancelTime(LocalDateTime.now());orderMapper.update(orders);}}}/*** 处理一直处于派送中状态的订单*/@Scheduled(cron = "0 0 1 * * ? ")//每日凌晨1点执行一次//@Scheduled(cron = "0/5 * * * * ?")public void processDeliveringOrder(){log.info("定时处理支付超时订单:{}", LocalDateTime.now());List<Orders> orderList =orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, LocalDateTime.now().plusMinutes(-60));if(orderList != null && orderList.size() > 0){for (Object orders : orderList) {Orders order = (Orders) orders;order.setStatus(Orders.COMPLETED);orderMapper.update(order);}}}}

mapper包下的OrderMapper:

 /*** 统计指定时间区间内订单数量* @param status* @param orderTime*/@Select("select * from orders where status = #{status} and order_time < #{orderTime}")List<Orders> getByStatusAndOrderTimeLT (Integer status, LocalDateTime orderTime);/*** 修改订单信息* @param orders*/void update(Orders orders);//这个语句有点长,放到其对应XML文件中了
<update id="update" parameterType="Orders">update orders<set><if test="number != null"> number=#{number}, </if><if test="status != null"> status=#{status}, </if><if test="addressBookId != null"> address_book_id=#{addressBookId}, </if><if test="orderTime != null"> order_time=#{orderTime},</if><if test="checkoutTime != null"> checkout_time=#{checkoutTime}, </if><if test="payMethod != null"> pay_method=#{payMethod}, </if><if test="payStatus != null"> pay_status=#{payStatus}, </if><if test="amount != null"> amount=#{amount}, </if><if test="remark != null"> remark=#{remark}, </if><if test="phone != null"> phone=#{phone}, </if><if test="address != null"> address=#{address}, </if><if test="userName != null"> user_name=#{userName}, </if><if test="consignee != null"> consignee=#{consignee} ,</if><if test="cancelReason != null"> cancel_reason=#{cancelReason}, </if><if test="rejectionReason != null"> rejection_reason=#{rejectionReason}, </if><if test="cancelTime != null"> cancel_time=#{cancelTime}, </if><if test="estimatedDeliveryTime != null"> estimated_delivery_time=#{estimatedDeliveryTime}, </if><if test="deliveryStatus != null"> delivery_status=#{deliveryStatus}, </if><if test="deliveryTime != null"> delivery_Time=#{deliveryTime}, </if><if test="packAmount != null"> pack_amount=#{packAmount},</if><if test="tablewareNumber != null"> tableware_number=#{tablewareNumber}, </if><if test="tablewareStatus != null"> tableware_status=#{tablewareStatus}, </if></set>where id=#{id}</update>

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…请添加图片描述

…。。。。。。。。。。。…

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

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

相关文章

灵敏度,精度,精确度,精密度,精准度,准确度,分辨率,分辨力——概念

文章目录前提总结前提 我最近在整理一份数据指标要求的时候&#xff0c;总是混淆这几个概念&#xff1a;灵敏度&#xff0c;精度&#xff0c;精确度&#xff0c;精密度&#xff0c;精准度&#xff0c;准确度&#xff0c;分辨率&#xff0c;分辨力&#xff0c;搜了一些文章&…

python-异常(笔记)

#后续代码可以正常运行 try:f open("xxx.txt","r",encodingutf-8)except:print("except error")#捕获指定异常&#xff0c;其他异常报错程序中止&#xff0c;管不到 try:print(name) except NameError as you_call:print("name error"…

[lvgl_player] 用户界面(LVGL) | 播放器核心设计

docs&#xff1a;基于LVGL的音乐播放器 本项目是为嵌入式设备设计的音乐播放系统&#xff0c;采用LVGL图形库构建用户界面。 系统支持播放WAV格式音频文件&#xff0c;具备播放列表管理功能&#xff0c;可实现播放/暂停控制、曲目切换等核心操作。 用户可通过交互界面实时调…

数据赋能(354)——数据分析——多角度分析原则

概述重要性如下&#xff1a;获得全面理解&#xff1a;多角度分析原则避免仅从单一角度解读数据&#xff0c;从不同角度、不同维度对数据进行分析&#xff0c;以获得更全面的理解。发现潜在规律&#xff1a;通过多角度分析&#xff0c;发现数据中的潜在规律和趋势&#xff0c;为…

【华为机试】127. 单词接龙

文章目录127. 单词接龙描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路算法分析问题本质分析单向BFS算法详解双向BFS算法详解邻居单词生成过程算法流程图边界情况分析各种解法对比时间复杂度分析空间复杂度分析关键优化点实际应用场景图构建策略双向BFS优化…

仿艾莫迅MODBUS调试工具写一个上位机

公司采购了一个夹具&#xff0c;项目负责人想要试探这个夹具的性能&#xff0c;于是想要我这边写一个烤机的程序&#xff0c;小编结合官网资料 https://wiki.amsamotion.com/?title196&doc222查看其pdf说明文档和调试工具并按照其工具写一个烤机上位机根据项目负责人的要求…

云展厅:开启数字化展示新时代

在科技飞速发展的今天&#xff0c;数字化浪潮正席卷各个行业&#xff0c;展览展示领域也不例外。云展厅作为一种全新的展览形式&#xff0c;正逐渐崭露头角&#xff0c;以其独特的优势和创新的技术应用&#xff0c;为观众带来前所未有的观展体验&#xff0c;也为企业和机构提供…

硬件电路基础学习

一、基础元器件学习 1、电阻 1.1 作用 电阻的工作原理是基于欧姆定律&#xff0c;即电阻的阻值取决于其材料、长度和横截面积。电阻的主要作用是限制电流&#xff0c;调节电压和电流&#xff0c;以及保护电路。1.2 数值计算 欧姆定律 通过欧姆定律计算所需保护电阻的大小注意…

基于C++和人工智能(DeepSeek)实践

基于C++和人工智能(如DeepSeek)实践 以下是基于C++和人工智能(如DeepSeek或其他AI框架)的实际应用示例,涵盖不同领域和技术方向,供参考: 基于C++和人工智能(如DeepSeek或其他AI框架)的实际应用示例 图像识别与处理 人脸检测:使用OpenCV和DNN模块加载预训练的Caffe…

书生浦语第五期L0G1000

完成 视频课程学习&#xff0c;并在 https://chat.intern-ai.org.cn/ 平台中实践提示词技巧&#xff0c;与 InternLM 和 InternVL 各完成 10 次对话记录在飞书文档中。 参加 浦语提示词工程论文分类打榜赛&#xff0c;分数超过 40 分 InternLM InternVL 浦语提示词工程论文分…

SpringCloud(一)微服务基础认识

1、介绍微服务架构是一种架构模式&#xff0c;它提倡将原本独立的单体应用&#xff0c;拆分成多个小型服务。这些小型服务各 自独立运行&#xff0c;服务与服务间的通信采用轻量级通信机制&#xff08;一般基于HTTP协议的RESTful API&#xff09; &#xff0c;达到互相协调、互…

MaxKB+MinerU:通过API实现PDF文档解析并存储至知识库

MinerU是一款开源的高质量数据提取工具&#xff0c;能够将PDF文档转换为Markdown和JSON格式。2025年6月13日&#xff0c;MinerU发布了v2.0版本&#xff0c;相较于v1.0版本实现了架构和功能的全面重构与升级。在优化代码结构和交互方式的同时&#xff0c;v2.0版本还集成了小参数…

一文了解 `package.json` 和 `package-lock.json`文件

所有使用 npm 或 yarn&#xff08;部分场景&#xff09;管理依赖的 JavaScript/Node.js 项目都会存在**的核心文件–package.json 和 package-lock.json&#xff0c;无论项目类型是 Vue、React、Angular&#xff0c;还是纯 Node.js 后端项目、普通 JavaScript 工具库等。 所以这…

【AI论文】大语言模型量化的几何原理:将GPTQ视为Babai最近平面算法

摘要&#xff1a;将大型语言模型&#xff08;LLMs&#xff09;的权重从16位量化到更低位宽&#xff0c;是实际部署大规模Transformer模型到更具性价比的加速器上的通用方法。GPTQ已成为大语言模型规模下一站式训练后量化的标准方法之一。然而&#xff0c;其内部工作原理被描述为…

数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 数据清洗 特征可视化 Kaggle数据集实操 读者收获&#xff1a;1周内具备数据预处理能力 数…

计算机系统层次结构

计算机系统通过多层抽象&#xff0c;平衡硬件效率与软件灵活性&#xff0c;各层以独立语言和功能构成有机整体。一、层次划分&#xff08;从底层到顶层&#xff09;层级名称特点实现方式第1级微程序机器层硬件直接执行微指令&#xff08;如微操作控制信号&#xff09;。物理硬件…

04 基于sklearn的机械学习-梯度下降(上)

梯度下降一 、为什么要用到梯度下降&#xff1f;正规方程的缺陷&#xff1a;非凸函数问题&#xff1a;损失函数非凸时&#xff0c;导数为0会得到多个极值点&#xff08;非唯一解&#xff09;计算效率低&#xff1a;逆矩阵运算时间复杂度 O(n3)&#xff0c;特征量翻倍时计算时间…

淘宝 API HTTP/2 多路复用与连接优化实践:提升商品数据采集吞吐量

一、引言​随着电商行业的蓬勃发展&#xff0c;对淘宝平台商品数据的采集需求日益增长。无论是市场调研公司分析市场趋势、电商平台整合商品资源&#xff0c;还是商家进行竞品分析&#xff0c;都需要高效、稳定地获取大量淘宝商品数据。然而&#xff0c;传统的 HTTP 协议在面对…

javascript中call、apply 和 bind 的区别详解

文章目录深入浅出&#xff1a;JavaScript 中的 call、apply 和 bind一、三位魔法师的共同使命二、各显神通的魔法师们1. call - 即时通讯专家2. apply - 批量处理高手3. bind - 预约服务大师三、魔法师们的对比表格四、魔法师们的实际应用1. 借用方法2. 函数柯里化3. 事件处理五…

【PHP】接入百度AI开放平台人脸识别API,实现人脸对比

目录 一、需求 二、准备工作 1、申请服务 2、创建应用&#xff0c;获取开发密钥 3、官方开发文档 4、测试人像图片 三、PHP接入 1、鉴权&#xff0c;获取access_token 2、人脸对比 四、完整代码 一、需求 现在人脸识别、人脸对比技术越来越成熟&#xff0c;使用越来越…