任务调度Quartz

      任务调度、Quartz任务调度 、了解Quartz框架、什么是任务调度

 

任务调度:根据时间,执行任务

生活案例

  1. 比如生活中的闹钟,我们设置闹钟每天早上七点执行响铃操作。我们给这个闹钟设定了时间,并且也给它设置了要进行执行的具体任务。关于这样的业务我们就称之为任务调度。
  2. 在爱旅行项目中,就引用任务调度这么一个功能。比如说,当用户在预订完酒店后,如果在两个小时内没有支付,那么就自动会被取消掉。关于这样的功能我们如何去解决呢?

解决方案

每十分钟扫描一下订单,来看一下订单库中有没有超过两个小时还没有支付的订单, 如果有的话就把订单给取消掉。这样的一个功能,它也有两个关键点,一个是每十分钟 执行一次。第二个关键点是具体要执行的任务是:对于那些超过两个小时还没有支付 的订单查询出来,然后进行一个取消的操作。那么具体如何实现呢?就要学习一下 Quartz框架

  1. 1 Quartz框架

官网: http://www.quartz-scheduler.org

核心概念:任务(Job)、触发器(Trigger)、调度器(Scheduler)

      1.2 Quartz工作原理

  1. 任务:需要执行的具体工作
  2. 触发器:在特定的时间触发任务的执行。
  3. 调度器:任务的实际执行者,负责粘合任务触发器

 

 1.3 使用Quartz框架编写定时任务

​​​​​​​      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-->

  1. 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);

  1. 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();
    }
}

     1. ​​​​​​​6  Quartz之调度器

  1. 调度器:任务的实际执行者,负责粘合任务触发器
  2. 通过JobDetail创建一个任务实例。
  3. 使用SimpleTrigger创建一个触发器。
  4. 创建一个调度器。

//3、创建调度器
//3.1 创建scheduler工厂SchedulerFactory的实例对象
SchedulerFactory factory = new StdSchedulerFactory();
//3.2 通过scheduler工厂对象获取调度器
Scheduler scheduler = factory.getScheduler();

  1. 注册任务和触发器。

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

    2.  启动和关闭调度。

//5、启动调度器。
scheduler.start();
Thread.sleep(2000);  //休眠2秒
//6、停止调度器
scheduler.shutdown();

完整代码如下所示。

//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();
    }
}

启动运行。

  1. 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();
    }
}

  1. Cron表达式
  2. Cron表达式由6~7个由空格分隔的时间元素组成,第7个元素可选)

位置

字段含义

范围

允许的特殊字符

1

0~59

* /

2

分钟

0~59

* /

3

小时

0~23

* /

4

月份中的哪一天

1~31

* / ? L

5

月份

1~12或JAN~DES

* /

6

星期几

1~7或SUN-SAT

* / ? L #

7

年份

1970~2099

* /

简写:秒 分 时 日 月 周 年

测试关键代码。

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

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

下面0-10表示0秒到10秒之间。

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

  • “,”:使用逗号间隔的数据,表示一个列表。

下面55,57,59 代表55秒、57秒、59秒的时候执行Job任务。

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

  • “/”:通常表示为x/y,x为起始值,y表示值的增量。

下面0/10,指从0秒开始,之后每10秒执行一次

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

  1. 10 Cron表达式示例

简写:秒 分 时 日 月 周 年

Cron表达式

含义

0 15 4 * * ?

每天凌晨4点15分

30 0 0 1 1 ? 2014

2014年1月1日凌晨过30秒

0 0 14 1,10,20 * ? *

每月的1号、10号、20号的下午2点

0 0/5 15,17 * * ?

每天15点到16点每5分钟运行一次,此外,每天17点到18点每分钟运行一次

  1. 11 使用Spring整合Quartz框架
    1. XML方式(了解)
    2. 注解方式(重点)

:可以到App信息管理系统中去整合。

  1. 在Controller中指定方法上面加入@Scheduled注解

    /***

     * 10分钟执行一次 刷新订单的状态 不对外公布

     */

    @Scheduled(cron = "0 0/10 * * * ?")

    public void flushCancelOrderStatus() {

        try {

            boolean flag = itripHotelOrderService.flushOrderStatus(1);

            logger.info(flag ? "刷取订单成功" : "刷单失败");

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

  1. 在springmvc-servlet.xml中添加task标签。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:task="http://www.springframework.org/schema/task"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd   

        http://www.springframework.org/schema/task

        http://www.springframework.org/schema/task/spring-task.xsd">

        <task:annotation-driven/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南大白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值