当前位置: 首页 > news >正文

重学SpringBoot3-整合Quartz定时任务

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

Quartz 是一个开源的任务调度框架,用于在应用程序中创建、管理和调度定时任务。将 Quartz 和 Spring Boot 3 结合,可以轻松实现定时任务的灵活管理。本文将详细介绍如何在 Spring Boot 3 项目中集成 Quartz Scheduler 并实现示例任务的调度。

1. 什么是 Quartz Scheduler?

Quartz 是 Java 平台下的一个强大、灵活的调度库,它支持复杂的任务调度,包括:

  • 简单的任务:按固定频率或延迟执行任务。
  • 基于 Cron 表达式的任务:支持类似于 Linux Cron 的表达式,用于定义复杂的定时任务。
  • 持久化任务:支持将任务数据持久化存储,以便在应用程序重启后可以恢复任务状态。

2. Spring Boot 3 集成 Quartz Scheduler 的优势

  • 无缝集成:通过 Spring Boot 3 的自动配置特性,无需编写复杂的配置即可使用 Quartz。
  • 灵活管理:支持任务的动态添加、暂停、恢复和删除。
  • 扩展性:可以轻松扩展任务调度系统,便于业务逻辑的复杂应用。

3. Spring Boot 3 集成 Quartz 的步骤

3.1 创建 Spring Boot 项目

可以使用 Spring Initializr 创建项目,选择以下依赖:

  • Spring Web
  • Quartz Scheduler

image-20241113205514778

3.2 添加 Quartz 依赖

如果使用的是手动创建的项目,可以在 pom.xml 中添加 Quartz 的依赖:

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

3.3 配置 Quartz 属性

application.ymlapplication.properties 文件中配置 Quartz 的基本属性,例如任务存储和调度方式。

以下是 application.yml 配置示例:

spring:application:name: spring-boot3-19-quartzquartz:job-store-type: memory  # 储类型为内存存储properties:org:quartz:threadPool:threadCount: 5  # 配置线程池线程数为 5jobStore:misfireThreshold: 60000  # 设置作业存储的错过触发阈值为 60000 毫秒(1分钟)

这里使用了内存存储方式(job-store-type: memory),也可以根据需要配置数据库存储任务信息。

3.4 创建一个 Quartz 任务类

创建一个简单的 Quartz 任务类,需要实现 Job 接口,并重写 execute 方法:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Component
public class SampleJob implements Job {private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {logger.info("Executing Sample Job at: " + context.getFireTime());}
}

3.5 配置任务调度器

在 Spring Boot 3 中,可以通过 @Configuration 创建 Quartz 的调度器,并配置定时任务的触发器(Trigger)和任务详情(JobDetail)。

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {@Beanpublic JobDetail sampleJobDetail() {return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob").storeDurably().build();}@Beanpublic Trigger sampleJobTrigger() {SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10)  // 每 10 秒执行一次.repeatForever();return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleJobTrigger").withSchedule(scheduleBuilder).build();}
}
  • sampleJobDetail 方法定义了任务的基本信息,包括任务类和名称。
  • sampleJobTrigger 方法定义了触发器的调度策略,这里设置为每 10 秒执行一次。

3.6 使用 Cron 表达式配置任务

除了简单的时间间隔,还可以通过 Cron 表达式实现更灵活的调度。以下示例展示如何使用 Cron 表达式配置任务触发器。

import org.quartz.CronScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;@Bean
public Trigger cronJobTrigger() {return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("cronJobTrigger").withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *"))  // 每分钟执行一次.build();
}

在这个例子中,Cron 表达式 "0 0/1 * 1/1 * ? *" 表示每分钟执行一次任务。

4. 运行应用并查看日志

配置完成后,启动 Spring Boot 应用。Quartz Scheduler 会按照配置执行 SampleJob 任务。您可以在控制台中看到日志输出,类似如下:

2024-11-13T21:07:39.910+08:00  INFO 11984 --- [spring-boot3-18-quartz] [eduler_Worker-4] c.coderjia.boot318quartz.job.SampleJob   : Executing Sample Job at: Wed Nov 13 21:07:39 CST 2024

每 10 秒执行一次效果:

每 10 秒执行一次

每分钟执行一次效果:

每分钟执行一次

5. 动态管理 Quartz 任务

可以在代码中动态地添加、暂停、恢复和删除任务。例如,以下是动态添加任务的示例:

package com.coderjia.boot318quartz;import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author CoderJia* @create 2024/11/13 下午 09:25* @Description**/
@Service
public class QuartzService {private final Scheduler scheduler;@Autowiredpublic QuartzService(Scheduler scheduler) {this.scheduler = scheduler;}public void scheduleJob(JobDetail jobDetail, Trigger trigger) {try {scheduler.scheduleJob(jobDetail, trigger);} catch (Exception e) {e.printStackTrace();}}public void pauseJob(String jobName, String jobGroup) {try {JobKey jobKey = new JobKey(jobName, jobGroup);scheduler.pauseJob(jobKey);System.out.println("Job paused: " + jobKey);} catch (SchedulerException e) {e.printStackTrace();}}public void resumeJob(String jobName, String jobGroup) {try {JobKey jobKey = new JobKey(jobName, jobGroup);scheduler.resumeJob(jobKey);System.out.println("Job resumed: " + jobKey);} catch (SchedulerException e) {e.printStackTrace();}}public void deleteJob(String jobName, String jobGroup) {try {JobKey jobKey = new JobKey(jobName, jobGroup);boolean deleted = scheduler.deleteJob(jobKey);if (deleted) {System.out.println("Job deleted: " + jobKey);} else {System.out.println("Job not found: " + jobKey);}} catch (SchedulerException e) {e.printStackTrace();}}
}

调用 scheduleJob 方法可以动态地添加新的任务。类似地,使用 scheduler.pauseJob()scheduler.deleteJob() 可以暂停或删除任务。

6. 总结

通过将 Quartz 与 Spring Boot 3 结合,我们可以实现强大而灵活的定时任务调度系统。本文介绍了 Quartz 的基本配置和使用方法,包括如何配置任务、触发器,以及使用 Cron 表达式实现复杂的调度策略。

相关文章:

重学SpringBoot3-整合Quartz定时任务

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ Quartz 是一个开源的任务调度框架&#xff0c;用于在应用程序中创建、管理和调度定时任务。将 Quartz 和 Spring Boot 3 结合&#xff0c;可以轻松实现定时任务的灵活管理…...

STM32单片机WIFI语音识别智能衣柜除湿消毒照明

实践制作DIY- GC0196-WIFI语音识别智能衣柜 一、功能说明&#xff1a; 基于STM32单片机设计-WIFI语音识别智能衣柜 二、功能介绍&#xff1a; STM32F103C系列最小系统板LCD1602显示器ULN2003控制的步进电机&#xff08;柜门开关&#xff09;5V加热片直流风扇紫外消毒灯DHT11…...

spring中entity的作用

在Spring框架中&#xff0c;特别是结合Spring Data JPA&#xff08;Java Persistence API&#xff09;时&#xff0c;Entity类用于表示数据库中的表。这些类通常用于ORM&#xff08;对象关系映射&#xff09;&#xff0c;即将对象模型与关系型数据库中的表进行映射。以下是Enti…...

2019年下半年试题二:论软件系统架构评估及其应用

论文库链接&#xff1a;系统架构设计师论文 论文题目 对于软件系统&#xff0c;尤其是大规模复杂软件系统而言&#xff0c;软件系统架构对于确保最终系统的质量具有十分重要的意义。在系统架构设计结束后&#xff0c;为保证架构设计的合理性、完整性和针对性&#xff0c;保证系…...

网络自动化04:python实现ACL匹配信息(主机与主机信息)

目录 背景分析代码代码解读代码总体结构1. load_pattern_from_excel 函数2. match_and_append_pattern 函数3. main 函数总结 最终的效果&#xff1a; 今天不分享netmiko&#xff0c;今天分享一个用python提升工作效率的小案例&#xff1a;acl梳理时的信息匹配。 背景 最近同事…...

字典树介绍以及C++实现

字典树的概念 字典树&#xff08;Trie&#xff09;&#xff0c;又称为前缀树或单词查找树&#xff0c;是一种树形数据结构&#xff0c;主要用于存储具有相同前缀的字符串集合。它特别适合用于词典中的单词查找、自动补全、拼写检查等应用。 字典树算法的核心思想就是每层存入…...

【C++】用红黑树封装set和map

在C标准库中&#xff0c;set容器和map容器的底层都是红黑树&#xff0c;它们的各种接口都是基于红黑树来实现的&#xff0c;我们在这篇文章中已经模拟实现了红黑树 ->【C】红黑树&#xff0c;接下来我们在此红黑树的基础上来看看如何封装set和map。 一、共用一颗红黑树 我…...

【大数据测试HDFS + Flask详细教程与实例】

大数据测试HDFS Flask 1. 环境准备安装工具安装Hadoop&#xff08;以单机模式为例&#xff09;安装Flask和HDFS Python客户端 2. HDFS Flask基本架构基本文件结构 3. 创建Flask应用与与HDFS交互步骤1&#xff1a;配置HDFS连接步骤2&#xff1a;构建Flask应用 4. 创建前端界面…...

高级java每日一道面试题-2024年10月31日-RabbitMQ篇-RabbitMQ中vhost的作用是什么?

如果有遗漏,评论区告诉我进行补充 面试官: RabbitMQ中vhost的作用是什么? 我回答: 在Java高级面试中&#xff0c;关于RabbitMQ中vhost&#xff08;虚拟主机&#xff09;的作用是一个重要且常见的考点。以下是对vhost的详细解释&#xff1a; 一、vhost的基本概念 vhost&am…...

【日常记录-Java】代码配置Logback

1. 简介 在Logback中&#xff0c;推荐使用配置文件&#xff08;如logback.xml或logback-spring.xml&#xff09;来设置日志记录的行为。但在实际应用中&#xff0c;会有动态配置logback的需求。此时可通过编程的方式直接操作LoggerContext以及相关的Logger、Appender、Encoder等…...

HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?

HTTP 请求头&#xff08;Request Headers&#xff09;用于在 HTTP 请求中携带额外的信息&#xff0c;帮助服务器更好地处理请求。以下是一些常见的 HTTP 请求头及其作用&#xff1a; 常见请求头及其作用 1. Accept 作用&#xff1a;告知服务器客户端可以接受的内容类型。示例…...

电信数据清洗案例:利用MapReduce实现高效数据预处理

电信数据清洗案例&#xff1a;利用MapReduce实现高效数据预处理 在大数据时代&#xff0c;电信行业积累了大量的用户通话、短信、上网等行为数据。在数据分析和机器学习模型训练前&#xff0c;对这些数据进行清洗是至关重要的一步。MapReduce 是一种高效的数据处理模型&#x…...

react 中 FC 模块作用

React.FC 是一个泛型类型&#xff0c;用于定义函数组件的类型 一、类型定义和代码可读性 1. 明确组件类型 使用React.FC定义一个组件时&#xff0c;使得组件的输入&#xff08;props&#xff09;和输出&#xff08;返回的 React 元素&#xff09;都有明确的类型定义。 impo…...

多模态大模型(1)--CLIP

CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型是一种多模态预训练神经网络&#xff0c;由OpenAI在2021年发布。它通过对比学习的方式&#xff0c;将图像和文本映射到同一个向量空间中&#xff0c;从而实现跨模态的检索和分类。下面介绍其基础功能&…...

opencv入门学习总结

opencv学习总结 不多bb&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 案例一&#xff1a; import cv2 # 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式 print(cv2.getVersionString()) """ 作用&#xff1a;它可以读取不同格式的图像文…...

C/C++内存管理 | new的机制 | 重载自己的operator new

一、C/C内存分布 1. 内存分区 栈又叫堆栈–非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信 .堆用于程序运行时动态内…...

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中&#xff0c;知识库管理系统&#xff08;KBMS&#xff09;已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性&#xff0c;以及如何快速搭建企业知识库。 知识库管理系统是什么&#xff1f; 知识库管理系统…...

uniapp 如何使用vuex store (亲测)

首先是安装&#xff1a; npm install vuexnext --save 安装之后&#xff0c;Vue2 这样写 不管在哪里&#xff0c;建立一个JS文件&#xff0c;假设命名&#xff1a;store.js 代码这样写&#xff1a; import Vue from vue; import Vuex from vuex;Vue.use(Vuex);const store…...

[编译报错]ImportError: No module named _sqlite3解决办法

1. 问题描述&#xff1a; 在使用python进行代码编译时&#xff0c;提示下面报错&#xff1a; "/home/bspuser/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py", line 18, in <module>import sqlite3File "/usr/local/lib/python2.7/sqlite3/_…...

【旷视科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...