哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
在上一期文章中,我们详细解析了 JVM 垃圾回收器的原理与调优策略,帮助大家掌握了如何通过优化 GC 来提升 Java 应用性能。然而,Java 开发的核心远不止性能调优,任务调度也是企业级开发中不可或缺的一部分。
Quartz 是一个功能强大且灵活的任务调度框架,而结合 Spring 框架 使用,能够更加高效、简洁地实现定时任务调度功能。本期,我们将深入探讨 SpringQuartz 的配置方式,从基础配置到动态任务调度,逐步揭示 SpringQuartz 的强大功能与最佳实践。
本文将系统讲解 SpringQuartz 的几种配置方式,包括:
通过本文的学习,你将能够轻松掌握如何在项目中集成 Quartz,快速搭建稳定高效的任务调度系统。
Quartz 是一个开源的 Java 任务调度框架,提供了强大的调度功能,例如:
结合 Spring 框架 使用,可以利用 Spring 的依赖注入与事务管理能力,简化任务调度的配置与开发。
SpringQuartz 的基本架构包含以下几个关键组件:
以下,我们将以多种配置方式逐步展示 SpringQuartz 的强大功能。
这是 Quartz 最早期的集成方式,使用 Spring 的 XML 配置文件来定义调度器、任务和触发器。
在项目的 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>
在 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>
创建 ExampleJob
类,包含任务逻辑:
package com.example.jobs;
public class ExampleJob {
public void execute() {
System.out.println("Executing Job: " + System.currentTimeMillis());
}
}
运行项目后,每隔 10 秒钟会在控制台打印 Executing Job
。
随着 Spring Boot 的流行,基于 Java Config 的配置方式逐渐成为主流,简洁高效。
与 XML 配置相同,引入 Quartz 和 Spring Boot 的依赖。
通过 @Configuration
注解配置 Quartz:
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail exampleJobDetail() {
return JobBuilder.newJob(ExampleJob.class)
.withIdentity("exampleJob")
.storeDurably()
.build();
}
@Bean
public Trigger exampleJobTrigger() {
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(exampleJobDetail())
.withIdentity("exampleTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
创建 Quartz 的标准 Job
实现:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class ExampleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Executing Job: " + System.currentTimeMillis());
}
}
运行项目后,同样会每隔 10 秒钟执行一次任务。
实际项目中,任务调度往往需要动态添加、修改或删除。以下是动态管理 Quartz 任务的示例。
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class QuartzService {
@Autowired
private 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);
}
}
调用 QuartzService
的 addJob
方法即可动态添加任务:
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
方法即可删除指定任务。
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;
}
SpringQuartz 是 Java 开发中任务调度的利器,通过灵活的配置方式,可以满足绝大多数定时任务需求。本文从传统 XML 配置到现代 Java Config,以及动态任务调度与持久化配置,全面解析了 SpringQuartz 的功能与使用场景。
无论是简单的任务调度,还是复杂的动态任务与持久化场景,SpringQuartz 都能提供强大支持。通过结合本文的学习与实践,你将能够在项目中灵活运用 Quartz,轻松构建高效、稳定的任务调度系统。
下一期,我们将继续探索 分布式任务调度与 Quartz 在分布式架构中的应用,敬请期待!
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
***
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。