Quartz任务调度 定时任务 循环触发

Quartz任务调度

1. 什么是任务调度
任务调度:根据时间,执行任务。
生活案例:

  1. 比如生活中的闹钟,我们设置闹钟每天早上七点执行响铃操作。我们给这个闹钟设定了时间,并且也给它设置了要进行执行的具体任务。关于这样的业务我们就称之为任务调度。
  2. 在订单支付中,就引用任务调度这么一个功能。比如说,当用户在预订完酒店后,如果在两个小时内没有支付,那么就自动会被取消掉。关于这样的功能我们如何去解决呢?
    解决方案:
    每十分钟扫描一下订单,来看一下订单库中有没有超过两个小时还没有支付的订单, 如果有的话就把订单给取消掉。这样的一个功能,它也有两个关键点,一个是每十分钟 执行一次。第二个关键点是具体要执行的任务是:对于那些超过两个小时还没有支付 的订单查询出来,然后进行一个取消的操作。那么具体如何实现呢?就要学习一下 Quartz框架。

2. Quartz框架

官网: http://www.quartz-scheduler.org
核心概念:任务(Job)、触发器(Trigger)、调度器(Scheduler)

3. Quartz工作原理

  1. 任务:需要执行的具体工作。
  2. 触发器:在特定的时间触发任务的执行。
  3. 调度器:任务的实际执行者,负责粘合任务和触发器。
    在这里插入图片描述

使用Quartz框架编写定时任务
1. Quartz环境初始化

  1. 创建一个普通的Maven项目,包名cn.quartz 项目名TestQuartz。
  2. 将Quartz所需要的Maven依赖进行添加。
<!-- START === Quartz所需要的依赖  === START-->
 <dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>1.8.6</version>
 </dependency>
<!-- END ===== Quartz所需要的依赖  ===== END-->

2. Quartz之任务
任务:需要执行的具体工作。

public class RemindJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //提醒服务类,封装提醒业务
        System.out.println("我正在执行....");
    }
}

上面是Job类中的业务代码,在业务代码编写完后,要具体如何去调用这个Job呢?这就需要创建JobDetail实例对象。
//1、创建Job任务, 第一个参数是Job的名字, 第二个参数是Job的所属分组 第三个是具体Job的class
JobDetail job = new JobDetail(“myJob”, “A”, RemindJob.class);

3. Quartz之触发器
触发器:

在特定的时间触发任务的执行。SimpleTrigger是Trigger的子类

//Quartz的测试类
public class TestQuartz {
    public static void main(String [] args) throws SchedulerException, InterruptedException {
        //1、创建Job任务,  第一个参数是Job的名字, 第二个参数是Job的所属分组  第三个是具体Job的class
        JobDetail job = new JobDetail("myJob", "A", RemindJob.class);

        //2、创建触发器Trigger。 REPEAT_INDEFINITELY 表示无限期重复. 重复间隔时间为3秒
        SimpleTrigger simTrig = new SimpleTrigger("trigRemindJob", SimpleTrigger.REPEAT_INDEFINITELY, 3000);
        //设置触发器在当前时间的下一秒开始。
        simTrig.setStartTime(new Date(System.currentTimeMillis()+ 1000));

        //3、创建调度器
        //3.1 创建scheduler工厂SchedulerFactory的实例对象
        SchedulerFactory factory = new StdSchedulerFactory();
        //3.2 通过scheduler工厂对象获取调度器
        Scheduler scheduler = factory.getScheduler();
        //4、将任务与触发器进行粘合
        scheduler.scheduleJob(job,simTrig);
        //5、启动调度器。
        scheduler.start();
        Thread.sleep(2000);  //休眠2秒
        //6、停止调度器
        scheduler.shutdown();
    }
}

4. Quartz之调度器

1)	调度器:任务的实际执行者,负责粘合任务和触发器。
2)	通过JobDetail创建一个任务实例。
3)	使用SimpleTrigger创建一个触发器。
4)	创建一个调度器。
//3、创建调度器
//3.1 创建scheduler工厂SchedulerFactory的实例对象
SchedulerFactory factory = new StdSchedulerFactory();
//3.2 通过scheduler工厂对象获取调度器
Scheduler scheduler = factory.getScheduler();

5)	注册任务和触发器。
//4、将任务与触发器进行粘合
scheduler.scheduleJob(job,simTrig);

6)	启动和关闭调度。
//
>5、启动调度器。
scheduler.start();
Thread.sleep(2000);  //休眠2秒
完整代码如下所示	
```java
//Quartz的测试类
public class TestQuartz {
    public static void main(String [] args) throws SchedulerException, InterruptedException {
        
        //3、创建调度器
        //3.1 创建scheduler工厂SchedulerFactory的实例对象
        SchedulerFactory factory = new StdSchedulerFactory();
        //3.2 通过scheduler工厂对象获取调度器
        Scheduler scheduler = factory.getScheduler();
        //4、将任务与触发器进行粘合
        scheduler.scheduleJob(job,simTrig);
        //5、启动调度器。
        scheduler.start();
        Thread.sleep(2000);  //休眠2秒
        //6、停止调度器
        scheduler.shutdown();
    }
}

5. Quartz之CronTrigger

CronTrigger是Trigger的子类。
触发器 应用场景 使用方式
SimpleTrigger 固定时间间隔的调度任务(例如:每2小时执行1次任务) 通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等。
CronTrigger 指定时间点的调度任务(例如:每天凌晨1:00执行1次) 通过定义Cron表达式
创建CronTrigger实例的代码。
CronTrigger cronTrigger = new CronTrigger(“myTrigger”,”group”,”* 35 15 ? * * ”);

测试代码如上所示。
//Quartz的测试类
public class TestQuartz {
    public static void main(String [] args) throws SchedulerException, InterruptedException, ParseException {
        //1、创建Job任务,  第一个参数是Job的名字, 第二个参数是Job的所属分组  第三个是具体Job的class
        JobDetail job = new JobDetail("myJob", "A", RemindJob.class);
        
        //2、创建CronTrigger实例对象,每天的10点26分执行JOB任务。
        CronTrigger cronTrigger = new CronTrigger("myCronTrigger","B","0 26 10 ? * * ");
       
        //3、创建调度器
        //3.1 创建scheduler工厂SchedulerFactory的实例对象
        SchedulerFactory factory = new StdSchedulerFactory();
        //3.2 通过scheduler工厂对象获取调度器
        Scheduler scheduler = factory.getScheduler();
        //4、将任务与触发器进行粘合
        scheduler.scheduleJob(job,cronTrigger);
        //5、启动调度器。
        scheduler.start();
        Thread.sleep(2000000);  //休眠2秒
        //6、停止调度器
        scheduler.shutdown();
    }
}

6. Cron表达式

  1. Cron表达式由6~7个由空格分隔的时间元素组成,第7个元素可选)
    在这里插入图片描述
    简写:秒 分 时 日 月 周 年。
    测试关键代码。

CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"0 54 10 * * ? ");

  1. Cron表达式有几个特殊的字符,说明如下。
  1. “*”:表示每一个值,它可以用于所有字段。
  2. “?”:该字符仅用于”月份中的哪一天”字段和”星期几”字段,表示不指定值。注:这两个字段不能同时使用*号或?号。 日、周字段
  3. “-”:中划线,表示一个范围。
    下面0-10表示0秒到10秒之间。

CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"0-10 54 10 * * ? ");

2.1 “,”:使用逗号间隔的数据,表示一个列表。
下面55,57,59 代表55秒、57秒、59秒的时候执行Job任务。

CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"55,57,59 54 10 * * ? ");

3.1 “/”:通常表示为x/y,x为起始值,y表示值的增量。
下面0/10,指从0秒开始,之后每10秒执行一次。

CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"0/10 54 10 * * ? ");

7. Cron表达式示例
简写:秒 分 时 日 月 周 年。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值