SpringBoot整合定时任务

news/2024/9/18 14:56:14/ 标签: spring boot, java, 后端

        定时任务是企业级开发中必不可少的组成部分,诸如长周期业务数据的计算,例如年度报表,诸如系统脏数据的处理,再比如系统性能监控报告,还有抢购类活动的商品上架,这些都离不开定时任务。本节将介绍两种不同的定时任务技术。

 一、Quartz

Quartz技术是一个比较成熟的定时任务框架,怎么说呢?有点繁琐,用过的都知道,配置略微复杂。springboot对其进行整合后,简化了一系列的配置,将很多配置采用默认设置,这样开发阶段就简化了很多。再学习springboot整合Quartz前先普及几个Quartz的概念。

  • 工作(Job):用于定义具体执行的工作

  • 工作明细(JobDetail):用于描述定时工作相关的信息

  • 触发器(Trigger):描述了工作明细与调度器的对应关系

  • 调度器(Scheduler):用于描述触发工作的执行规则,通常使用cron表达式定义规则

简单说就是你定时干什么事情,这就是工作,工作不可能就是一个简单的方法,还要设置一些明细信息。工作啥时候执行,设置一个调度器,可以简单理解成设置一个工作执行的时间。工作和调度都是独立定义的,它们两个怎么配合到一起呢?用触发器。完了,就这么多。下面开始springboot整合Quartz。

步骤①:导入springboot整合Quartz的starter

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

步骤②:定义任务Bean,按照Quartz的开发规范制作,继承QuartzJobBean

public class MyQuartz extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("quartz task run...");}
}

步骤③:创建Quartz配置类,定义工作明细(JobDetail)与触发器的(Trigger)bean

@Configuration
public class QuartzConfig {@Beanpublic JobDetail printJobDetail(){//绑定具体的工作return JobBuilder.newJob(MyQuartz.class).storeDurably().build();}@Beanpublic Trigger printJobTrigger(){ScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");//绑定对应的工作明细return TriggerBuilder.newTrigger().forJob(printJobDetail()).withSchedule(schedBuilder).build();}
}

工作明细中要设置对应的具体工作,使用newJob()操作传入对应的工作任务类型即可。

触发器需要绑定任务,使用forJob()操作传入绑定的工作明细对象。此处可以为工作明细设置名称然后使用名称绑定,也可以直接调用对应方法绑定。触发器中最核心的规则是执行时间,此处使用调度器定义执行时间,执行时间描述方式使用的是cron表达式。有关cron表达式的规则,各位小伙伴可以去参看相关课程学习,略微复杂,而且格式不能乱设置,不是写个格式就能用的,写不好就会出现冲突问题。

总结

  1. springboot整合Quartz就是将Quartz对应的核心对象交给spring容器管理,包含两个对象,JobDetail和Trigger对象

  2. JobDetail对象描述的是工作的执行信息,需要绑定一个QuartzJobBean类型的对象

  3. Trigger对象定义了一个触发器,需要为其指定绑定的JobDetail是哪个,同时要设置执行周期调度器

思考

上面的操作看上去不多,但是Quartz将其中的对象划分粒度过细,导致开发的时候有点繁琐,spring针对上述规则进行了简化,开发了自己的任务管理组件——Task,如何用呢?咱们下节再说。

二、Task

spring根据定时任务的特征,将定时任务的开发简化到了极致。怎么说呢?要做定时任务总要告诉容器有这功能吧,然后定时执行什么任务直接告诉对应的bean什么时间执行就行了,就这么简单,一起来看怎么做

详细可见:SpringBoot定时任务(一看就会)_springboot 定时任务-CSDN博客

步骤①:开启定时任务功能,在引导类上开启定时任务功能的开关,使用注解@EnableScheduling

@SpringBootApplication
//开启定时任务功能
@EnableScheduling
public class Springboot22TaskApplication {public static void main(String[] args) {SpringApplication.run(Springboot22TaskApplication.class, args);}
}

步骤②:定义Bean,在对应要定时执行的操作上方,使用注解@Scheduled定义执行的时间,执行时间的描述方式还是cron表达式

@Component
public class MyBean {@Scheduled(cron = "0/1 * * * * ?")public void print(){System.out.println(Thread.currentThread().getName()+" :spring task run...");}
}

完事,这就完成了定时任务的配置。总体感觉其实什么东西都没少,只不过没有将所有的信息都抽取成bean,而是直接使用注解绑定定时执行任务的事情而已。

如何想对定时任务进行相关配置,可以通过配置文件进行

spring:task:scheduling:pool:size: 1							# 任务调度线程池大小 默认 1thread-name-prefix: ssm_      	# 调度线程名称前缀 默认 scheduling-      shutdown:await-termination: false		# 线程池关闭时等待所有任务完成await-termination-period: 10s	# 调度线程关闭前最大等待时间,确保最后一定关闭

总结

  1. spring task需要使用注解@EnableScheduling开启定时任务功能

  2. 为定时执行的的任务设置执行周期,描述方式cron表达式


http://www.ppmy.cn/news/1515940.html

相关文章

Obsidian Publish的开源替代品Markopolis

什么是 Markopolis &#xff1f; Markopolis 是一款旨在提供 Markdown 文件的 Web 应用和 API 服务器。它允许您以网站形式共享 Markdown 笔记&#xff0c;并使用 API 与 Markdown 文件交互和操作它们。类似于 Obsidian Publish&#xff0c;但又不会被锁定在 Obsidian 生态系统…

微分方程(Blanchard Differential Equations 4th)中文版Section4.2

正弦强迫系统 在本节中,我们研究的是外力为正弦或余弦函数的强迫谐振子方程: d 2 y d t 2 + p d y d t + q y = g ( t ) , \frac{d^2 y}{dt^2} + p \frac{dy}{dt} + qy = g(t), dt2d2y​+pdtdy​+qy=g(t), 其中 g ( t ) g(t) g(t) 是一个正弦或余弦函数。这种类型的外部强…

qt creator自动运行单元测试

qt creator自动运行单元测试 工具-选项-Testing-General&#xff0c;找到Automatically run&#xff0c;选项卡选择All。

SwiftUI 革命:打造未来派用户界面的艺术

标题&#xff1a;SwiftUI 革命&#xff1a;打造未来派用户界面的艺术 在当今快速发展的移动应用领域&#xff0c;用户界面(UI)的设计和实现已经成为开发者们关注的焦点。SwiftUI&#xff0c;作为苹果公司推出的现代UI框架&#xff0c;以其声明式编程范式、强大的数据绑定能力和…

【C#】【EXCEL】BumblebeeComponentsAnalysisGH_Ex_Ana_CondUnique.cs

这段代码定义了一个名为 GH_Ex_Ana_CondUnique 的 Grasshopper 组件。以下是该组件的功能和介绍&#xff1a; 功能介绍&#xff1a; 这个组件是用于在 Excel 范围内添加基于唯一值的条件格式。它允许用户高亮显示工作表中的唯一值或非唯一值。 主要特点&#xff1a; 条件格式…

稳石机器人 | 工业级AMR S1200L,专为多样化需求设计,柔性拓展更易用

近日&#xff0c;稳石机器人重磅推出基于新品控制器ROC1000的全新移动机器人AMR S1200L&#xff0c;专为满足生产制造和仓储物流的多样化需求而设计&#xff0c;无需改造现场&#xff0c;最快可在1周内完成部署。 重载型AMR-S1200L设计注重实用性和灵活性&#xff0c;可在室内…

解决执行npm run dev报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS

问题&#xff1a; 最近下载了一个开源系统&#xff0c;执行npm install很顺利&#xff0c;以为大功告成&#xff0c;结果运行npm run dev时报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS 解决方法&#xff1a; 应用程序配置&#xff08;package.json&a…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

一本读懂数据库发展史的书

数据库及其存储技术&#xff0c;一直以来都是基础软件的主力。数据库系统的操作接口标准&#xff0c;也是应用型软件的重要接口&#xff0c;关系重大。 作为最“有感”的系统软件&#xff0c;数据库的历史悠久、品类繁多、创新活跃。 对数据库历史发展的介绍&#xff0c;有利…

前端知识点

1.常见文本标签 2.属性 3.区块 4.表单 如果那个性别只能是单选的话要加上name属性 css 相邻选择器就是跟在被选中的里面的所有 js基本语法 js函数&#xff1a;就跟C语言差不多啊 改文本 引入js

【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs

文章目录 Bumblebee/Classes/ExColumn.csFlow diagramDescriptionCode Bumblebee/Classes/ExColumn.cs Flow diagram #mermaid-svg-6WUm4r0wDJG9uelI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6WUm4r0wDJG9ue…

[Algorithm][综合训练][对称之美][经此一役小红所向无敌][连续子数组最大和]详细讲解

目录 1.对称之美1.题目链接2.算法原理详解 && 代码实现 2.经此一役小红所向无敌1.题目链接2.算法原理详解 && 代码实现 3.连续子数组最大和1.题目链接2.算法原理详解 && 代码实现 1.对称之美 1.题目链接 对称之美 2.算法原理详解 && 代码实现…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

使用SQLite进行Python简单数据存储的线程安全解决方案

在 Python 中使用 SQLite 进行简单数据存储时&#xff0c;线程安全是一个需要注意的问题。SQLite 本身是线程安全的&#xff0c;但在多线程环境下&#xff0c;可能仍然需要做一些额外的工作来确保数据访问的安全性。 1、问题背景 一位开发者正在编写一个简单的聊天服务器和客户…

leetcode 数组+哈希+双指针+子串+滑动窗口

——————双指针 283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …

sheng的学习笔记-AI-半监督学习

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是半监督学习 我们在丰收季节来到瓜田&#xff0c;满地都是西瓜&#xff0c;瓜农抱来三四个瓜说这都是好瓜&#xff0c;然后再指着地里的五六个瓜说这些还不好&#xff0c;还需再生长若干天。基于这些信息&a…

数学基础 -- 微积分之线性化

微积分中的线性化 在线性代数和微积分中&#xff0c;线性化是指使用一个线性函数来近似描述非线性函数在某一点附近的行为。在微积分中&#xff0c;线性化通常是通过泰勒展开将一个非线性函数线性化的过程。 线性化公式 给定一个函数 f ( x ) f(x) f(x)&#xff0c;我们可以…

微信小程序开发经验记录

1、把微信开发者工具安装好后&#xff0c;创建小程序。 AppID可以注册下&#xff0c;后续小程序上线会用到&#xff0c;前期可以使用测试号先开发程序&#xff0c;后续修改AppID即可。 模板选择基础模板就行。 2、开发页面如下。 左上角可以控制几个窗口的打开和关闭。模拟器窗…

arm64--内嵌汇编

内嵌汇编代码基本用法 1.作用&#xff1a;对于特定重要和时间敏感的代码进行优化&#xff0c;同时在C语言中访问某些特殊指令&#xff08;例如内存屏障指令&#xff09;来实现特殊功能 2.内嵌汇编代码主要有两种形式 基础内嵌汇编代码&#xff1a;不带任何参数 扩展内嵌汇…