Quartz 学习笔记

本文详细介绍了Quartz开源任务调度框架,包括其概念、功能、核心API以及如何整合Spring和Spring Boot实现任务调度。通过示例展示了如何使用SimpleTrigger和CronTrigger,并讨论了在集群环境下的配置与应用。
摘要由CSDN通过智能技术生成

Quartz

  1. quartz是什么
  2. quartz能做什么
  3. quartz的核心API
  4. 编写代码测试原生的quartz
  5. quartz的cron表达式
  6. 整合spring(spring mvc) - 单机版、集群版
  7. 整合springboot - 单机版 集群版
  8. springboot整合spring task实现任务调度

1.Quartz是什么?

  • Quartz官方网站:http://www.quartz-scheduler.org

  • Quartz是一个功能丰富的开源任务调度框架,几乎可以集成到任何java应用中,小到单体应用,大到大型电子商务系统;

  • Quartz可以用来执行成千上万的简单或复杂的调度任务;

  • Quartz的任务被定义成一组标准的java组件,几乎可以执行任何编程任务;

  • Quartz包含了一些企业级功能,包括JTA事务和集群;

2.Quartz能做什么?

相当于定时器 某时间点做某一件事

定时调度 定时邮件短信;

定时数据同步 ; 点赞数据一般存在redis定时存到关系型数据库

3.Quartz核心api

1.job:定义一个任务必须要实现的接口

2.jobDetail:用于描述任务 (属于什么任务组。任务名)

3.Trigger:定义任务执行时间、规则
simpleTrigger:定义任务和实质性、何时停止执行拼率
​cornTrigger:使用Corn表达式定义执行规则时间

4.Scheduler:调度器(使用Trigger定义的规则调度Job)

5.JobKey:定义任务组和任务名称

6.TriggerKey:定义Trigger组合Trigger名称

7.JobExecutionContext:任务执行上下文

8.JobBuilder、TriggerBuilder

4.使用代码测试SimpleTrigger

1.maven依赖

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

2.测试任务

  • 每隔5秒打印一次hello
  • 任务5秒后执行,之后每隔五秒执行一次重复10次
  • 任务5秒后执行,之后每隔5秒执行一次,30秒后停止执行
定义任务 HelloJob.java
测试类
	创建jobDetail
	创建trigger
	创建scheduler	

定义任务 HelloJob.java

public class HelloJob implements Job {
   
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
   
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS");
        String current = dateFormat.format(new Date());
        System.out.println(current);
    }
}

测试一:

//每隔5秒打印一次hello
public class First {
   
    public static void main(String[] args) throws SchedulerException {
   
        //创建jobDetail
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                //任务组  任务名
                .withIdentity("hello", "hello").build();
        //创建trigger
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("", "")
                .startNow()//调度时间:立即执行
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(5)//5秒执行一次
                                .repeatForever()//永远执行
                )//任务调度规则
                .build();
        //创建Scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.scheduleJob(jobDetail,trigger);
        scheduler.start();
    }
}

测试二:


//任务5秒后执行,之后每隔五秒执行一次
public class Second {
   
    public static void main(String[] args) throws SchedulerException {
   
        JobKey jobKey = new JobKey("hello", "hello");
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
            .withIdentity(jobKey)
            .build();

        Date current = new Date();
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:ss:mm SSS").format(current));
        Date fiveSecondsAfter = new Date(current.getTime() + 5000L);

        TriggerKey triggerKey = new TriggerKey("hello", "hello");
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
            .withIdentity(triggerKey)
            .startAt(fiveSecondsAfter)//5秒后执行
            .withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(5)//每隔5秒执行一次
                    .withRepeatCount(10)//重复10次
            ).build();

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}

测试三:

//任务5秒后执行,之后每隔5秒执行一次,30秒后停止执行
public class Third {
   
    public static void main(String[] args) throws SchedulerException {
   
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
            .withIdentity("hello", "hello")
            .build();
        System.out.println(LocalDateTime.now());
        Date date = new Date();
        Date fiveSecondsAfter = new Date(date.getTime()+5000L);
        Date thirtySecondsAfter = new Date(date.getTime() + 1000*30L);

        SimpleTrigger trigger = TriggerBuilder.newTrigger()
            .withIdentity("hello")
            .startAt(fiveSecondsAfter)
            .endAt(thirtySecondsAfter)
            .withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(5)
                    .repeatForever()
            ).build();

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.scheduleJob(jobDetail,trigger);
        scheduler.start();
    }
}

5.Quartz的Cron表达式

5.1 Quartz的Cron表达式(Cron Expression)
  1. Quartz的Cron表达式 1.1 Quartz的Cron表达式(Cron Expression)

  2. Quartz Cron表达式用于配置CronTrigger实例

     [秒]     [分]   [小时]   [天、日期]   [月]    [周]      [年](可选)
     seconds Minutes Hours Day-of-Month Month Day-of-Week YEAR
    
时间字段 是否必 填 取值范围 允许的特殊 字符
0-59 , * - /
0-59 , * - /
小时 0-23 , * - /
天/日期(每月的几 号) 1-31 , * - / ? L W
1-12(JAN-DEC) , * - /
周(星期几) 1-7(SUN-SAT)(1周天,7 周六) , * - / ? L #
空、1970-2099 , * - /
特 殊 字 符 解释
, 表示或的关系。如用在分钟:1,5 - 表示在第一分钟和第5分钟执行
* 每秒、每分、每小时、每天、每月等。在秒上写*,表示每秒钟都要执行
- 表示范围。如用在秒上:1-20 - 表示在1-20秒都要执行
/ 表示每隔多长时间执行。用在秒上:*/5或0/5 - 表示每隔5秒执行一次
? 只能用到天和周上 1.如果[天]字段上用了或确切的某一天,那么[周]只能用? 2.如果[周]字段上用了或确切的某一个周几,那么[天]只能用?
L 表示每个月的最后一天或者每个月的最后星期几,[周]写6L - 表示每个月 最后一个星期5
W 只能用在[天、日期]的字段,表示离这个日期最近的一个工作日 比如: 1. 25W:表示离这个月25号最近的一个工作日 如果25号是一个工作日,那么就是这天执行 如果25号是周六,那么应该是24号周五执行 如果25号是周天,那么应该是下周一26号执行 2.日期不能夸月 1W:离1号最近的工作日,如果1号是周六,那么离1号最近的工作日 应该是当月3号,而不是上个月的最后一天; 3.只能指定单一日期,不能用范围
# 用在[周]上,表示每个月第几个周几,例如在[周上]写SUN#2 - 表示每个 月第二个周天 母亲节的例子:母亲节当天8点执行一个短信发送任务 0 0 8 ? 5 SUN#2
举例 表达式
周一到周五8:50提醒打卡 0 50 8 ? * MON-FRI
每天凌晨1点到1点59分,每隔5分钟执行一次 0 0/5 1 * * ?
每隔5秒执行一次 */5 * * * * ?
每天5-15点整点触发 0 0 5-15 * * ?
表示每个星期三中午 12点 0 0 12 ? * WED
每月最后一天23点执行一次 0 0 23 L * ?
每月的最后一个星期五上午10:15触发 0 15 10 ? * 6L
每月的第三个星期五上午10:15触发 0 15 10 ? * FRI#3
5.2 cron表达式例子

CronTest

public class CronTest {
   
    public static void main(String[] args) throws SchedulerException {
   
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("hello")
                .build();
        //cron表达式测试每隔五秒执行一次
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("hello")
                .withSchedule(
                    CronScheduleBuilder
                        .cronSchedule("*/5 * * * * ?")//cron表达式
                ).build();
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler()
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值