Springboot 开发之任务调度框架(一)Quartz 简介

一、引言

常见的定时任务框架有 Quartz、elastic-job、xxl-job等等,本文主要介绍 Spirng Boot 集成 Quartz 定时任务框架。

在这里插入图片描述

二、Quartz 简介

Quartz 是一个功能强大且灵活的开源作业调度库,广泛用于 Java 应用中。它允许开发者创建复杂的调度任务,包括简单的周期性任务和复杂的日程安排。Quartz 支持多种类型的任务调度,包括按时间间隔、特定时间点、日历时间和其他复杂的时间表达式。

主要特性:

  • 丰富的调度表达式:支持 Cron 表达式,可以非常灵活地定义任务的调度时间。
  • 持久化支持:Quartz 支持将调度任务存储到数据库中,以保证任务在应用重启后能够继续执行。
  • 集群支持:Quartz 可以在集群环境中运行,提供高可用性和负载均衡功能。
  • 多种触发器:支持多种触发器,包括简单触发器、Cron触发器等。
  • 任务监听器:支持任务的监听器,能够在任务执行前后执行一些额外操作。

二、在 Spring Boot 中集成 Quartz

在 Spring Boot 中集成 Quartz 非常简单,Spring 提供了对 Quartz 的良好支持。以下是一个简单的例子,展示如何在 Spring Boot 项目中使用 Quartz。

步骤 1: 添加依赖

pom.xml 文件中添加以下依赖:

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

步骤 2: 创建一个任务

定义一个简单的 Quartz 任务类:

package com.example.demo;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

@Component
public class SampleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Executing Sample Job at " + System.currentTimeMillis());
    }
}

步骤 3: 配置 Quartz

在 Spring Boot 中配置 Quartz 调度器。可以在 application.properties 或 application.yml 文件中进行配置,也可以通过代码配置。

# 指定Quartz使用的作业存储类型为内存(RAMJobStore),这意味着所有的作业和触发器信息都将存储在内存中。
# 这种方式的存取速度较快,但在系统重启后,所有数据将会丢失,因此它不适合需要持久化作业信息的集群环境。
spring.quartz.job-store-type=memory

# 设置Quartz Scheduler的名称,用于区分不同的Scheduler实例。
spring.quartz.scheduler-name=SampleScheduler

# 配置当应用启动时,如果检测到已存在的作业(job)与配置的作业相同,则允许覆盖它们。
# 这可以避免在修改作业后需要手动删除数据库中的相关记录。
spring.quartz.overwrite-existing-jobs=true

# 配置Quartz线程池的线程数量,这里设置为5
spring.quartz.properties.org.quartz.threadPool.threadCount=5

步骤 4: 创建作业详情和触发器

通过 Java 配置类创建调度任务:

package com.example.demo;  
  
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;  
  
// 这是一个Spring配置类,用于定义Quartz的JobDetail和Trigger  
@Configuration  
public class QuartzConfig {  
  
    // 定义一个Bean,用于创建JobDetail实例  
    // JobDetail描述了Quartz要执行的具体任务  
    @Bean  
    public JobDetail sampleJobDetail() {  
        // 使用JobBuilder来构建一个JobDetail实例  
        // newJob(SampleJob.class)指定了实际要执行的Job类为SampleJob  
        // withIdentity("sampleJob")为这个JobDetail设置了一个唯一标识符  
        // storeDurably()使得JobDetail即使在没有Trigger关联的情况下也能被存储  
        return JobBuilder.newJob(SampleJob.class)  
                .withIdentity("sampleJob")  
                .storeDurably()  
                .build(); // 构建并返回JobDetail实例  
    }  
  
    // 定义一个Bean,用于创建Trigger实例(触发器)  
    // Trigger描述了JobDetail的执行计划,即何时开始执行、执行的频率等  
    @Bean  
    public Trigger sampleJobTrigger() {  
        // 使用SimpleScheduleBuilder来构建一个简单的调度计划  
        // withIntervalInSeconds(10)设置了任务执行的间隔为10秒  
        // repeatForever()表示任务将无限次重复执行  
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()  
                .withIntervalInSeconds(10)  
                .repeatForever();  
  
        // 使用TriggerBuilder来构建Trigger实例  
        // forJob(sampleJobDetail())指定了Trigger关联的JobDetail为之前定义的sampleJobDetail  
        // withIdentity("sampleTrigger")为这个Trigger设置了一个唯一标识符  
        // withSchedule(scheduleBuilder)设置了之前定义的调度计划  
        return TriggerBuilder.newTrigger()  
                .forJob(sampleJobDetail()) // 注意这里通常使用JobDetail的引用而不是方法调用,但在这个例子里也可以  
                .withIdentity("sampleTrigger")  
                .withSchedule(scheduleBuilder)  
                .build(); // 构建并返回Trigger实例  
    }  
}

步骤 5: 启动应用

启动 Spring Boot 应用程序,Quartz 调度器会自动启动,并按照配置的调度策略执行任务。

三、持久化配置

  1. 在 application.properties 文件中加入 Quartz 相关配置。
# 将 Quartz 持久化方式修改为 jdbc
spring.quartz.job-store-type=jdbc
# 实例名称(默认为quartzScheduler)
spring.quartz.properties.org.quartz.scheduler.instanceName=SC_Scheduler
# 实例节点 ID 自动生成
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
# 修改存储内容使用的类
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
# 数据源信息
spring.quartz.properties.org.quartz.jobStore.dataSource=quartz_jobs
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.driver=com.mysql.cj.jdbc.Driver
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.URL=jdbc:mysql://127.0.0.1:3306/quartz_jobs?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.user=root
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.password=123456
  1. 初始化 Quartz 数据表信息

下载 Quartz 发布包,下载完成后,解压缩进入 quartz-2.2.3/docs/dbTables 目录,找到匹配数据库的 SQL 文件

下载地址:
https://www.quartz-scheduler.org/downloads/files/quartz-2.2.3-distribution.tar.gz

然后在数据库中执行 tables-mysql.sql 初始化脚本。

四、总结

通过以上步骤,可以在 Spring Boot 应用中成功集成并使用 Quartz 来进行任务调度。Quartz 的强大之处在于其灵活性和可扩展性,能够满足各种复杂的任务调度需求。在实际应用中,可以根据具体需求配置更多的 Quartz 特性,如持久化、集群等。

  • 在生产环境中,需要配置 Quartz 的持久化选项,以便在应用程序重启后仍然可以恢复调度任务的状态。
  • 可以使用 @Autowired 将 Scheduler 注入到你的服务或组件中,以动态地添加、删除或更新作业和触发器。
  • Quartz 还提供了很多其他的功能和选项,如监听器、插件、作业恢复等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Doris 基础 -- 部分数据类型及操作

您还可以使用SHOW DATA TYPES;查看Doris支持的所有数据类型。 部分类型如下&#xff1a; Type nameNumber of bytesDescriptionSTRING/可变长度字符串&#xff0c;默认支持1048576字节(1Mb)&#xff0c;最大精度限制为2147483643字节(2gb)。大小可以通过BE配置string_type_le…

硕思LOGO设计师软件最新版下载及详细安装教程

硕思Logo设计师是一款操作灵活简单&#xff0c;且功能强大的logo制作软件。它可以通过简单的点击就可以为网站、博客、论坛和邮件创建专业的logo、条幅、按钮、标题、图标和签名等。 该软件提供了很多精心设计的模板和丰富的资源&#xff0c;为更好的创建logo艺术作品&#xff…

CST Studio Suite 基础操作实验(稳恒电流的电场与磁场)

前言 前置的基础操作可见笔者之前一篇文章&#xff0c;在此不再赘述 因为整个实验要求都要用英文&#xff0c;有些不便更改部分的英文就没翻译了&#xff0c;见谅 CST Studio Suite 基础操作实验&#xff08;静电场&#xff09;-CSDN博客 核心步骤 无限长设置 假如是z轴上的…

算法体系-22 第二十二节:暴力递归到动态规划(四)

一 最小距离累加和 1.1 描述 给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角 沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和 返回最小距离累加和 1.2 分析

【车载AI音视频电脑】200万像素迷你一体机

产品主要特点&#xff1a; -设备安装方便简洁&#xff0c;可通过3M胶直接将设备粘 贴到车前挡风玻璃上 -支持IE预览&#xff0c;手机&#xff0c;PAD实时预览&#xff0c; 支持电脑客 户端实时预览功能 -内置2路模拟高清, 每路均可达到200万像素。另 外可扩充2路1080P模拟…

什么是堡垒机?和跳板机是一个概念吗?

堡垒机&#xff0c;又称运维审计系统、跳板机&#xff0c;是一种位于内部网络与外部网络之间的安全防护设备&#xff0c;它充当了一个“中间人”的角色&#xff0c;所有对内部网络资源的远程访问都必须通过堡垒机进行。这一设计的核心目的&#xff0c;在于严格控制和记录所有进…

体验版小程序访问不到后端接口请求失败问题解决方案

文章目录 解决方案一&#xff1a;配置合法域名解决方案二&#xff1a;开发调试模式第一步&#xff1a;进入开发调试模式第二步&#xff1a;启用开发调试 注意事项结语 &#x1f389;欢迎来到Java面试技巧专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

IT运维三大王牌怎么选?一文看懂向日葵IT精英、行业青春、行业版

信息时代&#xff0c;随着智能化设备的不断普及&#xff0c;IT设备的数量是在不断增长的&#xff0c;企业的IT运维压力也逐渐增大&#xff0c;无论是大型企业、中小腰部企业、甚至初创企业和工作室&#xff0c;一款相对专业的远程IT运维方案也慢慢变成了刚需。 虽说大家都有着…

深度解析 | “透明部落(APT36)”持续攻击印度政府、国防部门

概要 近日&#xff0c;黑莓发现了总部位于巴基斯坦的高级持续威胁组织 Transparent Tribe (透明部落&#xff0c;APT36)&#xff0c;其目标是印度的政府、国防和航空航天部门。该活动从 2023 年底持续到 2024 年 4 月&#xff0c;并预计将持续下去。 在 "透明部落 "…

Python 显示笔记本电脑的电池状态和百分比

方法一&#xff1a; import psutil import psutil battery psutil.sensors_battery() if battery is None:print("No battery is found.")exit() print (battery) percentagebattery.percent print(f"Battery Percentage: {percentage}%")Battery的信息…

基于BP神经网络对鸢尾花数据集分类

目录 1. 作者介绍2. 关于理论方面的知识介绍2.1 BP神经网络原理2.2 BP神经网络结构 3. 关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1 鸢尾花数据集介绍3.2 代码演示3.3 结果演示 4. 问题与分析 1. 作者介绍 侯硕&#xff0c;男&#xff0c;西安工程大学…

【投稿优惠|权威主办】2024年能源、智能制造与材料科学国际学术会议(ICEIMMS 2024)

【投稿优惠|权威主办】2024年能源、智能制造与材料科学国际学术会议&#xff08;ICEIMMS 2024&#xff09; 2024 International Academic Conference on Energy, Intelligent Manufacturing, and Materials Science&#xff08;ICEIMMS 2024&#xff09; ▶会议简介 2024年能源…

充电宝哪个牌子好?揭秘无线磁吸充电宝哪个牌子性价比高!

大家是否曾经遇到过外出时手机电量告急&#xff0c;急需充电却苦于没有带充电器的情况&#xff1f;这时&#xff0c;满大街的共享充电宝就成了我们的救星。然而&#xff0c;在使用共享充电宝的过程中&#xff0c;我们也不得不面对一些现实问题。共享充电宝确实方便快捷&#xf…

LLM 大模型学习:数据预处理、模板设计以

在模型训练过程中&#xff0c;数据及数据处理是最为重要的工作之一。在当前模型训练流程趋于成熟的情况下&#xff0c;数据集的好坏&#xff0c;是决定了该次训练能否成功的最关键因素。 在上一篇中&#xff0c;我们提到了模型训练的基本原理是将文字转换索引再转换为对应的向…

element table 点击某一行中按钮加载

在Element UI中&#xff0c;实现表格&#xff08;element-table&#xff09;中的这种功能通常涉及到数据处理和状态管理。当你点击某一行的按钮时&#xff0c;其他行的按钮需要动态地切换为加载状态&#xff0c;这可以通过以下步骤实现&#xff1a; 1.表格组件&#xff1a;使用…

虹科免拆诊断案例 | 2014 款雪佛兰迈锐宝车驾驶人侧车窗开关无法控制其他车窗升降

故障现象  一辆2014款雪佛兰迈锐宝车&#xff0c;搭载LTD发动机&#xff0c;累计行驶里程约为12万km。车主反映&#xff0c;操作驾驶人侧车窗开关无法控制其他车窗升降&#xff0c;而操作其他车门上的车窗开关可以正常控制相应的车窗升降。 故障诊断  接车后试车&#xff0…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u2-sysin/&#xff0c;查看最新版。原创作…

Qt 非圆角图片裁剪为圆角图片

将Qt非圆角图片裁剪为圆角图片,步骤如下&#xff1a; 1、按照原始图片尺寸定义一张透明的新图形 2、使用画家工具在新图形上绘制一个圆角矩形线路 3、绘制图片 4、使用圆角矩形切割图片边角 封装成函数如下&#xff1a; QPixmap Widget::getRoundedPixmap(const QPixmap srcPix…

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…

Jmeter接口请求之 :multipart/form-data 参数请求

参考教程 Jmeter压测之&#xff1a;multipart/form-data_jmeter form-data-CSDN博客 1、通过fiddler对接口进行抓取&#xff0c;接口信息如下图所示 2、获取到接口后 在fiddler右侧点击Inspectors-Raw中可以看到如下图所示信息&#xff0c;上半部分为默认请求头信息内容&#…