[springboot]集成org.quartz-scheduler进行任务调度

本文介绍了如何在SpringBoot项目中集成Quartz Scheduler进行任务调度。内容包括依赖引入、Quartz配置文件设置、数据库建表、注解配置、自定义JobFactory、测试任务的创建以及控制器中使用Quartz的示例。在运行过程中,还提供了启动、查看、启动任务的控制台输出,并讨论了可能出现的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

springboot内置有org.springframework.scheduling.annotation.Scheduled可以让我们进行简单快速的任务调度(例如定时执行的任务),当我们一些和任务调度有关的业务开始复杂的时候,极其需要非常灵活的任务调度策略;在这种情况,博主使用了quartz,写下此文以记;

依赖(gradle)

    compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.2.1'

quartz的配置文件

springboot中集成quartz并进行持久化配置,在springboot项目中的resources目录下创建properties文件(和springboot的配置文件同级),命名quartz.properties;

内容如下:

# 固定前缀org.quartz
# 主要分为scheduler、threadPool、jobStore、plugin等部分
#
#实例名
org.quartz.scheduler.instanceName=TioadScheduler
#实例id(唯一,有缺省值)
org.quartz.scheduler.instanceId=TioadSchedulerId
org.quartz.scheduler.rmi.export=false
org.quartz.scheduler.rmi.proxy=false
org.quartz.scheduler.wrapJobExecutionInUserTransaction=false
# 实例化ThreadPool时,使用的线程类为SimpleThreadPool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
# threadCount和threadPriority将以setter的形式注入ThreadPool实例
# 并发个数
org.quartz.threadPool.threadCount=5
# 优先级
org.quartz.threadPool.threadPriority=5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
org.quartz.jobStore.misfireThreshold=5000
# 默认存储在内存中
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#持久化
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.dataSource=qzDS
org.quartz.dataSource.qzDS.driver=com.mysql.jdbc.Driver
#dev(第一次初始化quartz,需要执行quartz包下的sql,创建表结构)
org.quartz.dataSource.qzDS.URL=持久化的数据库url配置
org.quartz.dataSource.qzDS.user=持久化的数据库连接用户账号配置
org.quartz.dataSource.qzDS.password=持久化的数据库连接用户密码配置
org.quartz.dataSource
### Quartz Scheduler 日志信息与配置细节 Quartz Scheduler 是一个功能强大的任务调度框架,能够满足多种复杂场景下的定时任务需求。以下是关于日志信息和配置细节的详细解析。 #### 1. 日志信息解析 在执行 Quartz Scheduler 后的日志中[^1],可以提取到以下关键信息: - **Scheduler 版本**:v2.2.1(注意用户提问的是 v2.3.2,但此处日志版本为 v2.2.1)。 - **实例 ID**:`NON_CLUSTERED`,表示当前 Scheduler 实例运行在非集群模式下。 - **启动时间**:`Sun Jul 09 15:15:17 CST 2017`。 - **线程池**:使用了 `org.quartz.simpl.SimpleThreadPool`,默认线程数为 10。 - **Job 存储**:使用了 `org.quartz.simpl.RAMJobStore`,这意味着所有的 Job 和 Trigger 数据都存储在内存中,不支持持久化,并且是非集群化的。 日志中的 `[INFO]-[org.ws.quartz.test2.SchedulerExample] scheudler started` 表明 Scheduler 已成功启动,而 `Not currently in standby mode` 表示当前 Scheduler 不处于待机状态。 #### 2. 配置细节解析 ##### (1)线程池配置 Quartz 使用的线程池是 `SimpleThreadPool`,其默认配置如下: - 线程数量:10(可以通过配置文件调整)。 - 线程名称前缀:`QuartzWorker-`。 - 线程优先级:`Thread.NORM_PRIORITY`。 如果需要自定义线程池配置,可以在 `quartz.properties` 文件中进行设置: ```properties org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 20 org.quartz.threadPool.threadPriority = 5 ``` ##### (2)RAMJobStore 配置 RAMJobStore 是 Quartz 的默认 Job 存储方式,所有数据都存储在内存中。这种存储方式的优点是性能高、配置简单,但缺点是无法持久化数据,重启后会丢失所有任务信息。 配置示例如下: ```properties org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore ``` ##### (3)NON_CLUSTERED 模式 `NON_CLUSTERED` 表示当前 Scheduler 实例运行在单机模式下,不参与集群调度。如果需要启用集群模式,需要满足以下条件: - 使用支持持久化的 Job 存储(如 JDBC-JobStoreTX 或 JDBC-JobStoreCMT)。 - 所有集群节点共享同一个数据库。 - 配置文件中设置 `org.quartz.scheduler.instanceId=AUTO`。 ##### (4)Misfire 处理规则 Misfire 是指当触发器错过预定执行时间时的行为。Quartz 提供了多种 Misfire 处理策略[^4],常见的包括: - `MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY`:忽略 Misfire,按原计划继续执行。 - `MISFIRE_INSTRUCTION_FIRE_NOW`:立即执行。 - `MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT`:重新调度并保留原有重复次数。 配置示例如下: ```java trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); ``` #### 3. Spring Boot 集成 Quartz 的注意事项 在 Spring Boot 中集成 Quartz 时,通常需要在主类上添加以下注解[^5]: - `@SpringBootApplication`:启用 Spring Boot 应用。 - `@EnableScheduling`:启用 Spring 的任务调度功能。 - `@MapperScan`:扫描 MyBatis 映射器。 如果需要将 Job 存储从 RAMJobStore 切换到数据库存储,还需要配置 JDBC-JobStore[^5]。 #### 示例代码 以下是一个简单的 Quartz Job 定义示例[^2]: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloJob implements Job { private static final Logger log = LoggerFactory.getLogger(HelloJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { log.info("Hello World! - " + new Date()); } } ``` ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值