【SpringBoot篇】Spring_Task定时任务框架

文章目录

  • 🌹概述
  • 🌺应用场景
  • 🎄cron表达式
  • 🛸入门案例
  • 🎍实际应用

在这里插入图片描述

🌹概述

Spring Task 是 Spring 框架提供的一种任务调度和异步处理的解决方案。可以按照约定的时间自动执行某个代码逻辑它可以帮助开发者在 Spring 应用中轻松地实现定时任务、异步任务等功能,提高应用的效率和可维护性。

Spring Task 的主要特点包括:

  • 简单易用:Spring Task 提供了简洁的注解和配置方式,使得任务调度和异步处理变得非常容易上手。
  • 内置支持:Spring Task 内置于 Spring 框架中,无需额外的依赖,开发者可以直接在 Spring 应用中使用。
  • 灵活的任务调度:Spring Task 支持基于 cron 表达式的定时任务调度,能够满足各种复杂的调度需求。
  • 异步任务支持:除了定时任务,Spring Task 也支持异步任务的处理,能够在后台线程中执行耗时操作,提高系统的响应速度。
  • 集成注解:Spring Task 提供了 @Scheduled 注解用于标识定时任务的方法,以及 @Async 注解用于标识异步任务的方法,使用起来非常方便。
  • 监控和管理:Spring Task 支持任务的监控和管理,可以通过 JMX 或者 Spring Boot Actuator 进行任务的查看和控制。

🌺应用场景

  • 信用卡每月还款提醒

  • 银行贷款每月还款提醒

  • 自动续费短信提醒
    请添加图片描述

  • 火车票售票系统处理未支付订单

  • 入职纪念日为用户发送通知

下面我们来学习cron表达式,通过cron表达式可以定义任务的触发时间

🎄cron表达式

cron其实就是一个字符串,可以用来定义任务触发的时间
(之前讲Linux的文章中有提到cron表达式crond的基本操作)

请添加图片描述

其实我们不用自己手写cron表达式
我们可以通过在线生成器来生成cron表达式https://cron.qqe2.com/

🛸入门案例

请添加图片描述
使用的是黑马程序员的《苍穹外卖》项目的代码来进行学习


在启动类中加上@EnableScheduling

在这里插入图片描述

新建一个task包和MyTask类
在这里插入图片描述

package com.sky.task;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.Date;@Component
@Slf4j
public class MyTask {//定时任务@Scheduled(cron = "0/5 * * * * ?")public void executeTask(){log.info("定时任务执行{}",new Date());}
}

在这里插入图片描述
每隔5秒触发一次

上面我们完成了SpringTask入门案例的编写,下面我们来讲解在《苍穹外卖》中的应用

🎍实际应用

请添加图片描述

我们新创建一个类OrderTask
在这里插入图片描述

package com.sky.task;import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.util.List;@Component
@Slf4j
public class OrderTask {@Autowiredprivate OrderMapper orderMapper;//处理超时订单的方法@Scheduled(cron = "0 * * * * ? ")//每分钟触发一次public void processTimeoutOrder(){log.info("定时处理超时订单{}", LocalDateTime.now());//获取当前时间,并在当前时间的基础上减去 15 分钟LocalDateTime time=LocalDateTime.now().plusMinutes(-15);List<Orders> ordersList=orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT,time);if (ordersList!=null&&ordersList.size()>0){for (Orders orders:ordersList){orders.setStatus(Orders.CANCELLED);orders.setRejectionReason("订单超时,已取消");orders.setCancelTime(LocalDateTime.now());orderMapper.update(orders);}}}//处理一直处于派送中状态的订单@Scheduled(cron = "0 0 1 * * ?")//每天凌晨一点触发一次public void processDeliveryOrder(){log.info("定时处理处于派送中的订单{}",LocalDateTime.now());//获取当前时间,并在当前时间的基础上减去 60 分钟LocalDateTime time=LocalDateTime.now().plusMinutes(-60);List<Orders>ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS,time);if (ordersList!=null&&ordersList.size()>0){for (Orders orders:ordersList){orders.setStatus(Orders.CANCELLED);orderMapper.update(orders);}}}
}

在这里插入图片描述

进入OrderMapper接口里面编写sql

根据订单状态和下单时间查询订单
在这里插入图片描述
这样子我们就完成了
在这里插入图片描述

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

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

相关文章

电脑开机显示器没反应?5个方法轻松解决!

“各位朋友们&#xff0c;我想问问&#xff0c;电脑开机显示器没反应是为啥呢&#xff1f;有什么方法可以解决这个问题吗&#xff1f;感谢感谢&#xff01;” 在使用电脑时&#xff0c;用户可能会遇到各种各样的情况。电脑开机显示器没反应也是一个比较常见的电脑问题。遇到这种…

c语言:回文字符串

题目&#xff1a; 思路&#xff1a; 创建一个字符数组&#xff0c;然后判断字符串长度&#xff0c;用循环&#xff0c;看对应字符是否相等&#xff0c;相等则输出&#xff0c;不相等则将对应字符ascll较大的改成ascll较小的&#xff08;题目要求字典最小的情况&#xff09;。…

【Vue入门篇】基础篇—Vue指令,Vue生命周期

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;Vue概述&#x1f384;快速入门&#x1f33a;Vue指令⭐v-…

【深度学习】学习率及多种选择策略

学习率是最影响性能的超参数之一&#xff0c;如果我们只能调整一个超参数&#xff0c;那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量&#xff0c;当学习率最优时&#xff0c;模型的有效容量最大。本文从手动选择学习率到使用预热机制…

P8599 [蓝桥杯 2013 省 B] 带分数(dfs+全排列+断点判断)

思路&#xff1a;1.深度枚举所有排列情况 2.设置为每个排列设置两个断点&#xff0c;分为三部分&#xff1a;a,b,c 3.转换为乘法判断条件&#xff0c;满足加一 代码如下&#xff1a;&#xff08;可用next_permutation全排列函数代替dfs&#xff09; #include<iostream>…

122.买卖股票的最佳时机II(不限次数)

题目 题解 labuladong的状态图解 class Solution:def maxProfit(self, prices: List[int]) -> int:N len(prices)# 定义状态&#xff1a;dp[i][j]表示在第i天持有或卖出时的最大利润&#xff0c;j1代表持有&#xff0c;j0代表卖出dp [[0 for j in range(2)] for i in ra…

PC8223(CC/CV控制)高耐压输入5V/3.4A同步降压电路内建补偿带恒流恒压输出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降压调节器,输出电流高达3.4A,操作范围从8V到32V的宽电源电压。内部补偿要求最低数量现成的标准外部组件。PC8233在CC&#xff08;恒定输出电流&#xff09;模式或CV&#xff08;恒定输出电压&#xff09;模式&#x…

超详细 | 实验室linux服务器非root账号 | 安装pip | 安装conda

登录实验室公用服务器&#xff0c;个人账号下&#xff08;非root&#xff09;是空的&#xff0c;啥也没有&#xff0c;想安装下pip和conda。 转了一圈&#xff0c;好像没太有针对这个需求写具体博客的&#xff0c;但有挺多讲直接在root下安的&#xff08;用的应该是个人虚拟机&…

CSGO搬砖项目全面讲解 ,CSGO搬砖注意事项

Steam/CSGO游戏搬砖全套操作流程之如何选品&#xff08;第二课&#xff09; 一个游戏只要能搬&#xff0c;只要体量不够大&#xff0c;很快就会货币价格暴跌&#xff0c;直接凉凉。市面上的能稳定手动搬砖的游戏越来越少。所以对于兼职赚点外快的散人搬砖党来说&#xff0c;找一…

前向传播与损失函数

在机器学习和深度学习中&#xff0c;前向传播和损失函数是两个关键概念。它们在神经网络的训练过程中起着重要的作用&#xff0c;帮助模型学习和优化参数。 一、前向传播 前向传播是机器学习和深度学习中一种信息传递的过程。在神经网络中&#xff0c;前向传播指的是将输入数…

银河麒麟V10-ARM架构-postgresql安装与部署指南

提示&#xff1a;本人长期接收外包任务。 前言 本文详细介绍应用源码进行pgsql的安装步骤&#xff0c;本文以postgresql-12.0为例。 一、下载并解压安装包 ☆下载地址&#xff1a;https://ftp.postgresql.org/pub/source/ 解压安装包&#xff0c;创建安装路径&#xff1a; …

Springboot+vue的新冠病毒密接者跟踪系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的新冠病毒密接者跟踪系统(有报告)。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的新冠病毒密接者跟踪系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;v…