深入学习:SpringQuartz的配置方式!

全文目录:

    • 开篇语
    • 前言
    • 摘要
    • 概述
    • 1. 基于 XML 的传统配置
      • 配置步骤
        • 1.1 Maven 依赖
        • 1.2 XML 配置文件
        • 1.3 实现 Job 类
    • 2. 基于 Java Config 的现代配置方式
      • 配置步骤
        • 2.1 Maven 依赖
        • 2.2 配置类
        • 2.3 实现 Job 类
    • 3. 动态任务调度
      • 动态添加任务
      • 动态删除任务
    • 4. Quartz 持久化配置
      • 配置数据库
        • 数据库脚本
        • 配置文件
      • 启用持久化
    • 应用场景案例
    • 优缺点分析
      • 优点
      • 缺点
    • 小结
    • 总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在上一期文章中,我们详细解析了 JVM 垃圾回收器的原理与调优策略,帮助大家掌握了如何通过优化 GC 来提升 Java 应用性能。然而,Java 开发的核心远不止性能调优,任务调度也是企业级开发中不可或缺的一部分。

Quartz 是一个功能强大且灵活的任务调度框架,而结合 Spring 框架 使用,能够更加高效、简洁地实现定时任务调度功能。本期,我们将深入探讨 SpringQuartz 的配置方式,从基础配置到动态任务调度,逐步揭示 SpringQuartz 的强大功能与最佳实践。


摘要

本文将系统讲解 SpringQuartz 的几种配置方式,包括:

  • 基于 XML 的传统配置。
  • 基于 Java Config 的现代配置方式。
  • 动态任务调度与持久化配置。
  • 常见调试与优化技巧。

通过本文的学习,你将能够轻松掌握如何在项目中集成 Quartz,快速搭建稳定高效的任务调度系统。


概述

Quartz 是一个开源的 Java 任务调度框架,提供了强大的调度功能,例如:

  • 基于 Cron 表达式的任务调度
  • 动态任务管理
  • 持久化任务存储
  • 分布式任务调度支持

结合 Spring 框架 使用,可以利用 Spring 的依赖注入与事务管理能力,简化任务调度的配置与开发。

SpringQuartz 的基本架构包含以下几个关键组件:

  1. Job:任务逻辑的核心实现。
  2. Trigger:定义任务触发的规则,例如 Cron 表达式。
  3. Scheduler:任务调度器,负责管理任务的执行。

以下,我们将以多种配置方式逐步展示 SpringQuartz 的强大功能。


1. 基于 XML 的传统配置

这是 Quartz 最早期的集成方式,使用 Spring 的 XML 配置文件来定义调度器、任务和触发器。

配置步骤

1.1 Maven 依赖

在项目的 pom.xml 中引入 Quartz 和 Spring 的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>
1.2 XML 配置文件

applicationContext.xml 中定义调度器、任务和触发器:

<bean id="exampleJob" class="com.example.jobs.ExampleJob" /><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="exampleJob" /><property name="targetMethod" value="execute" />
</bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail" /><property name="cronExpression" value="0/10 * * * * ?" /> <!-- 每10秒执行一次 -->
</bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /></list></property>
</bean>
1.3 实现 Job 类

创建 ExampleJob 类,包含任务逻辑:

package com.example.jobs;public class ExampleJob {public void execute() {System.out.println("Executing Job: " + System.currentTimeMillis());}
}

运行项目后,每隔 10 秒钟会在控制台打印 Executing Job


2. 基于 Java Config 的现代配置方式

随着 Spring Boot 的流行,基于 Java Config 的配置方式逐渐成为主流,简洁高效。

配置步骤

2.1 Maven 依赖

与 XML 配置相同,引入 Quartz 和 Spring Boot 的依赖。

2.2 配置类

通过 @Configuration 注解配置 Quartz:

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {@Beanpublic JobDetail exampleJobDetail() {return JobBuilder.newJob(ExampleJob.class).withIdentity("exampleJob").storeDurably().build();}@Beanpublic Trigger exampleJobTrigger() {CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");return TriggerBuilder.newTrigger().forJob(exampleJobDetail()).withIdentity("exampleTrigger").withSchedule(scheduleBuilder).build();}
}
2.3 实现 Job 类

创建 Quartz 的标准 Job 实现:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class ExampleJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("Executing Job: " + System.currentTimeMillis());}
}

运行项目后,同样会每隔 10 秒钟执行一次任务。


3. 动态任务调度

实际项目中,任务调度往往需要动态添加、修改或删除。以下是动态管理 Quartz 任务的示例。

动态添加任务

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class QuartzService {@Autowiredprivate Scheduler scheduler;public void addJob(String jobName, String triggerName, String cronExpression) throws SchedulerException {JobDetail jobDetail = JobBuilder.newJob(ExampleJob.class).withIdentity(jobName).build();CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName).withSchedule(scheduleBuilder).forJob(jobDetail).build();scheduler.scheduleJob(jobDetail, trigger);}
}

调用 QuartzServiceaddJob 方法即可动态添加任务:

quartzService.addJob("dynamicJob", "dynamicTrigger", "0/15 * * * * ?");

动态删除任务

public void removeJob(String jobName, String triggerName) throws SchedulerException {scheduler.unscheduleJob(new TriggerKey(triggerName));scheduler.deleteJob(new JobKey(jobName));
}

调用 removeJob 方法即可删除指定任务。


4. Quartz 持久化配置

Quartz 提供了将任务存储到数据库的能力,以便在系统重启后任务依然可用。

配置数据库

数据库脚本

Quartz 提供了创建任务表的 SQL 脚本(位于 Quartz 的官方文档中),运行脚本以初始化数据库。

配置文件

application.properties 中配置 Quartz 数据源:

spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.datasource.url=jdbc:mysql://localhost:3306/quartzdb
spring.datasource.username=root
spring.datasource.password=123456

启用持久化

在 Spring 配置中启用持久化:

@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {SchedulerFactoryBean factory = new SchedulerFactoryBean();factory.setDataSource(dataSource);factory.setOverwriteExistingJobs(true);return factory;
}

应用场景案例

  1. 定时数据同步:通过 Quartz 定时同步外部数据,例如定时抓取天气数据或电商库存信息。
  2. 消息推送系统:实现基于时间的消息推送功能,例如定时发送优惠信息。
  3. 任务处理调度:调度后台任务,例如生成报表或清理日志。

优缺点分析

优点

  1. 配置灵活:支持 XML、Java Config 等多种配置方式。
  2. 动态管理:支持任务的动态添加、修改和删除。
  3. 持久化支持:任务信息可持久化到数据库,支持系统重启后的任务恢复。
  4. 强大的触发规则:支持 Cron 表达式及多种触发器。

缺点

  1. 学习曲线较高:Quartz 的功能复杂,配置相对较繁琐。
  2. 对分布式支持有限:需要与其他框架(如 Spring Cloud)结合实现分布式调度。

小结

SpringQuartz 是 Java 开发中任务调度的利器,通过灵活的配置方式,可以满足绝大多数定时任务需求。本文从传统 XML 配置到现代 Java Config,以及动态任务调度与持久化配置,全面解析了 SpringQuartz 的功能与使用场景。


总结

无论是简单的任务调度,还是复杂的动态任务与持久化场景,SpringQuartz 都能提供强大支持。通过结合本文的学习与实践,你将能够在项目中灵活运用 Quartz,轻松构建高效、稳定的任务调度系统。

下一期,我们将继续探索 分布式任务调度与 Quartz 在分布式架构中的应用,敬请期待!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

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

相关文章

ClickHouse与TiDB实操对比:从入门到实战的深度剖析

ClickHouse与TiDB实操对比&#xff1a;从入门到实战的深度剖析 宝子们&#xff0c;在当今数据驱动的时代&#xff0c;选择合适的数据库对于处理海量数据和支撑业务发展至关重要。ClickHouse和TiDB作为两款备受关注的数据库&#xff0c;各自有着独特的优势和适用场景。今天&…

element-ui messageBox 组件源码分享

messageBox 弹框组件源码分享&#xff0c;主要从以下两个方面&#xff1a; 1、messageBox 组件页面结构。 2、messageBox 组件属性。 一、组件页面结构。 二、组件属性。 2.1 title 标题&#xff0c;类型为 string&#xff0c;无默认值。 2.2 message 消息正文内容&#xf…

睡眠健康领域的智能硬件设备未来的发展趋势

随着社会节奏的不断加快&#xff0c;人们的睡眠问题愈发多了起来&#xff0c;主要表现有以下几个方面&#xff1a; 睡眠质量下降 浅睡眠增多&#xff1a;现代生活中&#xff0c;人们面临着各种压力源&#xff0c;如工作压力、生活琐事、经济压力等&#xff0c;这些压力会导致大…

支付页面安全与E-Skimming防护----浅谈PCI DSS v4.0.1要求6.4.3与11.6.1的实施

关键词&#xff1a;支付页面安全、E-Skimming、PCI DSS v4.0.1、第三方脚本、风险管理、持卡人数据、数据安全、第三方服务提供商、TPSP、内容安全、网页监控、恶意脚本攻击 本文为atsec和作者技术共享类文章&#xff0c;旨在共同探讨信息安全的相关话题。转载请注明&#xff…

【gradio】从零搭建知识库问答系统-Gradio+Ollama+Qwen2.5实现全流程

从零搭建大模型问答系统-GradioOllamaQwen2.5实现全流程&#xff08;一&#xff09; 前言一、界面设计&#xff08;计划&#xff09;二、模块设计1.登录模块2.注册模块3. 主界面模块4. 历史记录模块 三、相应的接口&#xff08;前后端交互&#xff09;四、实现前端界面的设计co…

案例分享|树莓派媒体播放器,重构商场广告的“黄金三秒”

研究显示&#xff0c;与传统户外广告相比&#xff0c;数字户外广告在消费者心中的记忆率提高了17%&#xff0c;而动态户外广告更是能提升16%的销售业绩&#xff0c;整体广告效率提升了17%。这一显著优势&#xff0c;使得越来越多资源和技术流入数字广告行业。 户外裸眼3D广告 无…

23种设计模式-装饰器(Decorator)设计模式

装饰器设计模式 &#x1f6a9;什么是装饰器设计模式&#xff1f;&#x1f6a9;装饰器设计模式的特点&#x1f6a9;装饰器设计模式的结构&#x1f6a9;装饰器设计模式的优缺点&#x1f6a9;装饰器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

[Vue]事件修饰符

文章目录 一、语法介绍二、添加代码三、结果展示四、参考文献 如有错误&#xff0c;请指正&#xff01;&#xff01;&#xff01; 一、语法介绍 1、问题来源 我们在处理网页时&#xff0c;当点击按钮时会触发对应事件&#xff0c;但是有时并不想触发该时间&#xff0c…

Go 语言 sync 包使用教程

Go 语言 sync 包使用教程 Go 语言的 sync 包提供了基本的同步原语&#xff0c;用于在并发编程中协调 goroutine 之间的操作。 1. 互斥锁 (Mutex) 互斥锁用于保护共享资源&#xff0c;确保同一时间只有一个 goroutine 可以访问。 特点&#xff1a; 最基本的同步原语&#x…

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply

docker中间件部署

1.docker安装 # 1.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安装包 yum install -y yum-utils# 3.设置镜像的仓库 # 3.1.默认是国外的&#x…

python康复日记-request库的使用,爬虫自动化测试

一&#xff0c;request的简单应用 #1请求地址 URLhttps://example.com/login #2参数表单 form_data {username: admin,password: secret } #3返回的响应对象response response requests.post(URL,dataform_data,timeout5 ) #4处理返回结果&#xff0c;这里直接打印返回网页的…

强化学习和智能决策:Q-Learning和Deep Q-Learning算法

强化学习(Reinforcement Learning, RL)是机器学习的一个重要分支,它通过智能体(Agent)与环境交互来学习最优决策策略,旨在最大化智能体的长期累积奖励。Q-Learning和Deep Q-Learning是强化学习中的两种关键算法,它们在智能决策领域发挥着重要作用。 一、强化学习基础 …

ubuntu22.04 安装Jitsi meet 开源会议系统,代替腾讯会议

0.安装 官方安装教程Self-Hosting Guide - Debian/Ubuntu server | Jitsi Meet 一定要用域名访问&#xff0c; 一定要用域名访问&#xff0c; 一定要用域名访问&#xff0c; 一定要用域名访问&#xff0c; 域名一定要有ssl证书&#xff0c;域名一定要有ssl证书&#xff0c;域名…

专家管理系统(源码+文档+讲解+演示)

引言 在知识经济时代&#xff0c;专家管理系统成为了企业优化知识资源、提升决策效率的重要工具。本文将介绍一款创新的专家管理系统&#xff0c;该系统通过智能化工具&#xff0c;助力企业实现专家资源的高效管理和利用。 平台概述 专家管理系统采用前后端分离的架构设计&a…

css基础-选择器

选择器进阶 子串选择器 /* 匹配 href 以 "https" 开头的链接 */ a[href^"https"] {color: green; }/* 匹配 href 包含 "example" 的链接 */ a[href*"example"] {text-decoration: underline; }/* 匹配 href 以 ".pdf" 结尾…

Spring Boot属性设置方法及优先级完整说明+表格对比

Spring Boot属性设置方法及优先级完整说明 官网参考&#xff1a; https://docs.spring.io/spring-boot/3.4-SNAPSHOT/reference/features/external-config.html#features.external-config.files 属性设置方法优先级顺序&#xff08;从高到低&#xff09; 命令行参数&#xf…

上门家政小程序实战,从0到1解决方案

一、逻辑分析 上门家政小程序主要涉及用户端和服务端两大部分。用户端需要实现服务浏览、预约下单、订单跟踪等功能&#xff1b;服务端则要处理订单管理、服务人员管理、数据统计等任务。以下是详细的功能模块分析&#xff1a; 用户注册与登录&#xff1a;用户通过手机号或第三…

LLVM学习-DragonEgg工具

2.2.2 使用DragonEgg和LLVM工具了解编译流程 如果希望看到前端的运行情况&#xff0c;请使用-S -fplugin-arg-dragonegg-emit-ir标志&#xff0c;该标志将产生以LLVM IR代码表示的人工可读文件。 一旦编译器将程序转换为IR则停止编译&#xff0c;并将内存中的表示内容写入磁盘的…

关于cmd中出现无法识别某某指令的问题

今天来解决以下这个比较常见的问题&#xff0c;安装各种软件都可能会发生&#xff0c;一般是安装时没勾选注册环境变量&#xff0c;导致cmd无法识别该指令。例如mysql&#xff0c;git等&#xff0c;一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…