杰瑞科技汇

Java Quartz时间设置如何精准配置?

  1. 核心概念Job, JobDetail, Trigger, Scheduler
  2. Cron 表达式详解:这是时间设置的核心
  3. Java 代码示例:如何创建一个带有特定时间设置的定时任务
  4. 常用 Cron 表达式示例
  5. 其他 Trigger 类型简介:除了 CronTrigger,还有哪些选择

核心概念

在设置时间之前,你需要了解 Quartz 的几个基本组件:

Java Quartz时间设置如何精准配置?-图1
(图片来源网络,侵删)
  • Job (任务):这是一个接口,你需要实现它来定义你想要执行的具体业务逻辑,发送邮件、生成报表等。
  • JobDetail (任务详情):它包含了 Job 的实例以及 Job 的一些配置信息(比如任务名、任务组),它不是 Job 类本身,而是 Job 的“计划表”。
  • Trigger (触发器):它决定了 Job 何时以及如何执行,我们最常用的就是 CronTrigger,它通过 Cron 表达式来定义执行时间。
  • Scheduler (调度器):这是 Quartz 的总指挥,它负责将 JobDetail 和 Trigger 关联起来,并按照 Trigger 的定义来执行 Job。

简单比喻

  • Job:你要做的具体事情(打扫卫生”)。
  • JobDetail:为“打扫卫生”这件事准备的详细计划(打扫办公室,每周一次”)。
  • Trigger:设定执行“打扫卫生”的具体时间点(每周五下午 5 点”)。
  • Scheduler:负责监督和执行这个计划,确保每周五下午 5 点你真的去打扫卫生。

Cron 表达式详解

Cron 表达式是一个字符串,由 6-7 个时间字段组成,用来定义任务的执行时间,它的格式非常灵活但也很严格。

语法结构

秒 分 时 日 月 星期 年(可选)
字段 允许的值 特殊字符
0-59 , , ,
0-59 , , ,
0-23 , , ,
1-31 , , , , L , W
1-12 或 JAN-DEC , , ,
星期 1-7 或 SUN-SAT , , , , L , W
1970-2099 , , ,

特殊字符含义

  • (星号):代表“所有值”,在“时”字段上使用 ,表示每小时都执行。
  • (逗号):用于列出多个值,在“星期”字段上使用 MON,WED,FRI,表示周一、周三、周五执行。
  • (连字符):用于定义一个范围,在“时”字段上使用 9-17,表示从上午 9 点到下午 5 点(包括 9 和 17 点)。
  • (斜杠):用于定义“起始时间”和“间隔时间”,在“分”字段上使用 0/5,表示从第 0 分钟开始,每隔 5 分钟执行一次。*/10 表示每隔 10 分钟执行一次。
  • L (Last):表示“,它在“日”和“星期”字段上有特殊含义。
    • 在“日”字段上:L 表示该月的最后一天(1月31日,2月28日或29日)。
    • 在“星期”字段上:L 表示该周的最后一个星期六(或星期日,取决于你的日历设置)。6LSATL 都表示“最后一个周六”。
  • W (Weekday):表示“工作日”,它只能用于“日”字段,表示离该日期最近的工作日(周一到周五)。15W 表示如果 15 号是周六,则会在 14 号(周五)触发;15 号是周日,则会在 16 号(周一)触发,15 号本身就是工作日,则就在 15 号触发。
  • (井号):用于表示“第几个星期X”,它只能用于“星期”字段。6#3 表示“每月的第 3 个周六”。

Java 代码示例

下面是一个完整的 Java 示例,展示如何创建一个每分钟执行一次的定时任务。

步骤 1: 创建 Job 类

实现 org.quartz.Job 接口。

Java Quartz时间设置如何精准配置?-图2
(图片来源网络,侵删)
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 这里写你的业务逻辑
        System.out.println("Hello, Quartz! 任务执行时间: " + new java.util.Date());
    }
}

步骤 2: 配置并启动 Scheduler

在主程序中,配置 Scheduler,创建 JobDetailTrigger,并将它们关联起来。

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzSchedulerExample {
    public static void main(String[] args) throws SchedulerException {
        // 1. 创建一个 SchedulerFactory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // 2. 获取一个 Scheduler 实例
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 3. 定义 JobDetail
        // JobDetail 需要指定一个名称、一个组,以及关联的 Job 类
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob", "group1") // 任务名和任务组
                .build();
        // 4. 定义 Trigger (CronTrigger)
        // 使用 CronTriggerBuilder 来创建 Trigger,并设置 Cron 表达式
        // "0/10 * * * * ?" 表示每 10 秒执行一次
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1") // 触发器名和触发器组
                .startNow() // 立即启动
                .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) // 设置 Cron 表达式
                .build();
        // 5. 将 JobDetail 和 Trigger 关联并调度
        scheduler.scheduleJob(jobDetail, trigger);
        // 6. 启动 Scheduler
        scheduler.start();
        System.out.println("Quartz 调度器已启动...");
        // 为了让程序不退出,可以保持运行
        try {
            Thread.sleep(60000); // 运行60秒后关闭
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 关闭调度器
        scheduler.shutdown();
        System.out.println("Quartz 调度器已关闭。");
    }
}

如何运行:

  1. 确保你的项目中已经添加了 Quartz 的依赖(Maven 或 Gradle)。
  2. 创建 MyJob.javaQuartzSchedulerExample.java 文件。
  3. 运行 QuartzSchedulerExamplemain 方法。
  4. 你会看到控制台每 10 秒打印一次 "Hello, Quartz!"。

常用 Cron 表达式示例

需求 Cron 表达式 说明
每秒执行 0/1 * * * * ? 从第 0 秒开始,每 1 秒执行一次。
每 5 分钟执行 0 0/5 * * * ? 每小时的 0, 5, 10, 15... 分钟执行。
每天凌晨 1 点执行 0 0 1 * * ? 每天 1 点 0 分 0 秒执行。
每天中午 12 点执行 0 0 12 * * ? 每天 12 点执行。
每天上午 10 点和下午 4 点执行 0 0 10,16 * * ? 在 10 点和 16 点执行。
Java Quartz时间设置如何精准配置?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇