介绍
Quartz 是一个功能强大的 Java 任务调度库,能够调度执行定时任务或周期性任务。它支持复杂的调度方式,适用于分布式任务系统。本篇文章将介绍如何在 Java 项目中使用 Quartz。
1. 添加依赖
在使用 Quartz 之前,需要在项目中引入相应的依赖库。以下是基于 Maven 的项目依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
对于 Gradle,可以添加以下依赖:
implementation 'org.quartz-scheduler:quartz:2.3.2'
2. 创建一个 Job
Quartz 中的每个任务都由一个 Job
来表示。Job
是一个接口,所有任务类都需要实现它的 execute()
方法。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello Quartz! 当前时间: " + System.currentTimeMillis());
}
}
3. 创建 JobDetail 和 Trigger
JobDetail
表示任务的定义,而 Trigger
表示任务的触发方式(如何时执行)。以下代码展示了如何创建一个简单的任务,并定义每隔 5 秒执行一次。
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzScheduler {
public static void main(String[] args) throws SchedulerException {
// 1. 创建 Scheduler 实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. 定义 JobDetail
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("helloJob", "group1")
.build();
// 3. 定义 Trigger(5 秒执行一次)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("simpleTrigger", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)
.repeatForever())
.build();
// 4. 将 JobDetail 和 Trigger 绑定到调度器上
scheduler.scheduleJob(jobDetail, trigger);
// 5. 启动调度器
scheduler.start();
// 6. 调度器运行一段时间后关闭
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 7. 停止调度器
scheduler.shutdown();
}
}
解释:
Scheduler
是 Quartz 的核心,它管理和控制任务的执行。JobDetail
是对任务的定义,包含任务的类和任务的元数据。Trigger
用于定义任务的触发方式。这里使用SimpleScheduleBuilder
每隔 5 秒重复执行一次。- 调度器启动后,任务会按设定的触发器条件执行。
4. 使用 CronTrigger
除了 SimpleTrigger
,Quartz 还支持更加复杂的 CronTrigger
,它允许使用 Cron 表达式来定义任务的执行时间。
Trigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("cronTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * ? * * *"))
.build();
上面的 Cron 表达式 "0/10 * * ? * * *"
表示每隔 10 秒执行一次。
5. 处理任务中的数据
在实际应用中,任务通常需要一些上下文数据。我们可以使用 JobDataMap
来传递数据。
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("helloJob", "group1")
.usingJobData("message", "Hello from Quartz!")
.build();
在 Job
的 execute()
方法中可以通过 JobExecutionContext
获取传递的数据:
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String message = dataMap.getString("message");
System.out.println("执行任务: " + message + " 当前时间: " + System.currentTimeMillis());
}
}
6. 任务持久化
Quartz 支持将任务信息持久化到数据库中。使用 JDBC JobStore 可以让任务在调度器重启后依然存在。为了启用持久化功能,需要配置 Quartz 的 quartz.properties
文件并设置相应的数据源。
以下是部分配置示例:
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource=myDS
org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver
org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.myDS.user=root
org.quartz.dataSource.myDS.password=password
7. 总结
本文介绍了 Quartz 的基本使用方法,从创建简单任务到使用 Cron 表达式进行任务调度,并且还介绍了如何传递数据和持久化任务。Quartz 提供了非常灵活的定时任务调度能力,适合各种场景的任务调度需求。
评论 (0)