Quartz表达式:定时任务调度的实现

Quartz表达式:定时任务调度的实现

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Quartz表达式,它是定时任务调度的一个强大工具,特别适用于需要灵活调度任务的场景。

1. Quartz表达式简介

Quartz是一款功能强大的开源作业调度框架,广泛应用于Java应用程序中进行定时任务调度。Quartz表达式(Cron表达式)是用来定义任务调度时间的规则,它可以设置任务在特定的时间、日期或周期内执行。

2. Quartz表达式的语法

Quartz表达式有六个字段,分别是秒、分钟、小时、日期、月份和星期。每个字段都可以包含特定的值和符号,用于指定任务的执行时间。

秒   分钟   小时   日期   月份   星期
 *    *      *      *      *      *

2.1 字段说明

  • 秒(0-59): 任务执行的秒数。
  • 分钟(0-59): 任务执行的分钟数。
  • 小时(0-23): 任务执行的小时数。
  • 日期(1-31): 任务执行的日期。
  • 月份(1-12): 任务执行的月份。
  • 星期(0-6): 任务执行的星期(0是星期天)。

2.2 常用符号

  • *: 代表任何值。
  • ,: 分隔多个值。
  • -: 表示范围。
  • /: 指定增量。
  • L: 表示最后一个(通常用于日期和星期字段)。
  • W: 表示最接近的工作日。
  • #: 表示每月第几个星期几。

3. Quartz表达式示例

3.1 每分钟执行一次

package cn.juwatech.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.JobKey;
import org.quartz.JobDataMap;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;

public class MinuteJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Job executed at: " + new java.util.Date());
    }

    public static void main(String[] args) {
        try {
            SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();

            JobDetail jobDetail = JobBuilder.newJob(MinuteJob.class)
                .withIdentity("minuteJob", "group1")
                .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("minuteTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
                .build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

3.2 每天凌晨1点执行

package cn.juwatech.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;

public class DailyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Daily job executed at: " + new java.util.Date());
    }

    public static void main(String[] args) {
        try {
            SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();

            JobDetail jobDetail = JobBuilder.newJob(DailyJob.class)
                .withIdentity("dailyJob", "group1")
                .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("dailyTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?"))
                .build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

3.3 每月的第一个工作日执行

package cn.juwatech.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;

public class MonthlyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Monthly job executed at: " + new java.util.Date());
    }

    public static void main(String[] args) {
        try {
            SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();

            JobDetail jobDetail = JobBuilder.newJob(MonthlyJob.class)
                .withIdentity("monthlyJob", "group1")
                .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("monthlyTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 1W * ?"))
                .build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

3.4 每周一和周四下午5点执行

package cn.juwatech.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;

public class WeeklyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Weekly job executed at: " + new java.util.Date());
    }

    public static void main(String[] args) {
        try {
            SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();

            JobDetail jobDetail = JobBuilder.newJob(WeeklyJob.class)
                .withIdentity("weeklyJob", "group1")
                .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("weeklyTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 17 ? * MON,THU"))
                .build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

4. Quartz调度器的配置

4.1 配置文件

Quartz的配置通常在quartz.properties文件中完成,配置项包括线程池大小、调度程序属性等。以下是一个简单的配置示例:

# 定义线程池
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.jobStore.misfireThreshold = 60000

# 设置线程池大小
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3

4.2 通过Java代码配置

Quartz的调度器也可以通过Java代码进行配置。这种方式允许程序在运行时动态配置调度任务。

package cn.juwatech.quartz;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;

public class CustomScheduler {
    public static void main(String[] args) {
        try {
            SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();

            JobDetail jobDetail = JobBuilder.newJob(MonthlyJob.class)
                .withIdentity("customJob", "group1")
                .build();

            Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("customTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0

 0 12 15 * ?"))
                .build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

5. 总结

Quartz表达式为任务调度提供了灵活且强大的调度能力。通过掌握Quartz表达式的语法和应用实例,我们能够精确地控制任务的执行时间和频率,从而在复杂的系统中实现高效的任务调度。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值