JavaWeb(蒼穹外賣)--學習筆記16(定時任務工具Spring Task,Cron表達式)

前言

本篇文章是學習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;使用越來越…