Java Quartz 定时任务调度

尽意
2024-10-19 / 0 评论 / 18 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年10月19日,已超过95天没有更新,若内容或图片失效,请留言反馈。

介绍

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();

Jobexecute() 方法中可以通过 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 提供了非常灵活的定时任务调度能力,适合各种场景的任务调度需求。

3

评论 (0)

取消