当前位置:首页 > 技术 > 正文内容

Quartz定时任务调度框架

访客 技术 2026年5月29日 1

一、引言

Quartz是一个功能强大的定时任务调度框架,适用于需要在特定时间执行任务的场景。例如:

  • 30分钟后检查订单支付状态,若未支付则取消订单
  • 每月29日自动执行信用卡还款

Quartz的作用是根据预设的触发时间规则,自动执行相应的任务(Job)。通过简单的配置即可实现复杂的时间调度逻辑。

二、使用Quartz

2.1 添加依赖

在项目中添加Quartz依赖:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

2.2 定义任务

创建一个简单的任务类:

package com.example.task;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

public class MyTask implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        JobKey key = jobDetail.getKey();
        String taskName = key.getName();
        String taskGroup = key.getGroup();
        System.out.println("任务开始执行,任务名:" + taskName + ",分组:" + taskGroup + ",时间:" + new Date());
    }
}

2.3 创建调度程序

使用主程序测试任务调度:

package com.example.task;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTest {
    public static void main(String[] args) throws SchedulerException {
        // 创建调度器
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        
        // 创建触发器
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(5) // 每5秒执行一次
                        .repeatForever())
                .build();
        
        // 创建任务详情
        JobDetail jobDetail = JobBuilder.newJob(MyTask.class)
                .withIdentity("job1", "group1")
                .build();
        
        // 注册任务和触发器
        scheduler.scheduleJob(jobDetail, trigger);
        
        // 启动调度器
        scheduler.start();
    }
}

2.4 配置Quartz

创建配置文件quartz.properties,放在classpath目录下:

# 指定调度器实例名称
org.quartz.scheduler.instanceName = MyScheduler
# 指定线程池实现类
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 设置线程池大小
org.quartz.threadPool.threadCount = 10
# 设置线程优先级
org.quartz.threadPool.threadPriority = 5
# 使用内存存储任务(非持久化)
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

三、核心组件

Quartz的主要组件包括:

  • 调度器(Scheduler):负责任务的调度和执行,是Quartz的核心管理单元。
  • 任务(Job):需要定时执行的具体逻辑代码。
  • 任务详情(JobDetail):对任务进行封装,包括任务名称、分组等信息。
  • 触发器(Trigger):定义任务的执行时间规则。

四、触发器(Trigger)

4.1 SimpleTrigger

SimpleTrigger适用于基于固定时间间隔的任务调度:

SimpleTrigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("trigger1", "group1")
    .startNow()
    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInMinutes(1) // 每分钟执行一次
            .repeatForever())
    .build();

4.2 CronTrigger

CronTrigger支持基于Cron表达式的复杂调度规则:

CronTrigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("trigger1", "group1")
    .withSchedule(CronScheduleBuilder.cronSchedule("0 15 10 * * ?")) // 每天10:15执行
    .build();

4.3 Cron表达式解析

Cron表达式格式为:秒 分 时 日 月 星期

支持的特殊符号包括:

  • *:表示所有可能的值
  • ?:表示不指定值
  • -:表示范围
  • ,:表示多个值
  • /:表示间隔
  • L:表示最后一天

五、Spring与Quartz整合

5.1 添加依赖

在Spring项目中添加以下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.6</version>
</dependency>

5.2 配置调度器

在Spring配置文件中定义任务和触发器:

<bean name="myTask" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="name" value="my_task"/>
    <property name="group" value="task_group"/>
    <property name="jobClass" value="com.example.task.MyTask"/>
</bean>

<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="name" value="my_trigger"/>
    <property name="group" value="trigger_group"/>
    <property name="jobDetail" ref="myTask"/>
    <property name="cronExpression" value="*/5 * * * * ?"/> 
</bean>

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="myTrigger"/>
        </list>
    </property>
</bean>

5.3 启动调度器

在主程序中启动Spring上下文以启动调度器:

public static void main(String[] args) throws InterruptedException {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。