quartz任务调度器

  • quartz框架
  1. 是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。的最新版本为 2.3.0。
    • openSymphony开源组织的一个开源项目
    • 官网
      • http://www.quartz-scheduler.org
    • 核心概念
      • 任务(Job)
        • 需要执行的具体工作任务:需要执行的具体工作
      • 触发器(Trigger)
        • 在特定的时间触发任务的执行
      • 调度器(Scheduler)
        • 任务的实际执行者,负责粘合任务和触发器

 

quartz环境初始化

入门案例

  • 创建maven工程
  • 引入quartz依赖

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

  • 定义任务

public class RemindJob implements Job {
 
    public RemindJob() {}
 
    /**
     * jobExecutionContext:通过此参数,可以获取调度上下文的各种信息,例如:任务名称等;
     * job接口中只有一个execute()方法,在实现类中实现该方法以执行具体任务
     *
     * @param jobExecutionContext
     * @throws JobExecutionException
     */
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 提醒服务类,封装提醒业务
        System.out.println("任务执行...");
    }
}

  • 创建任务

/**
 *  参数1:任务的名称,可以自定义
 *  参数2:任务的分组名(多个任务可以进行分组)
 *  参数3:任务的类型,.class字节码文件,通过反射进行操作
 */
new JobDetail("remindJob", "group1", RemindJob.class);

  • 创建触发器
    • 触发器:在特定的时间触发任务的执行
    • SimpleTrigger是Trigger的子类

/**
 * 创建触发器 trigger
 * 参数1:触发器名称
 * 参数2:触发器执行的规则/策略
 * 参数3:重复间隔时间
 * setStartTime:表示开始时间
 */
SimpleTrigger simTrig = new SimpleTrigger(
    "trigRemindJob", SimpleTrigger.REPEAT_INDEFINITELY, 3000);
simTrig.setStartTime(new Date(System.currentTimeMillis() + 1000));

  • 创建调度器
    • 任务的实际执行者,负责粘合任务和触发器

/**
 * quartz定义了一个工厂,可以通过工厂得到scheduler实例
 */
SchedulerFactory sfc = new StdSchedulerFactory();
Scheduler scheduler = sfc.getScheduler();

  • 注册任务和触发器

/**
 * 通过scheduler的scheduleJob绑定任务和触发器
 */
scheduler.scheduleJob(jobDetail, simTrig);

  • 任务的启动和关闭

/**
 * 任务的启动和关闭
 */
scheduler.start();
scheduler.shutdown();

cronTrgger的使用

  • cronTrigger是trigger的子类

触发器

应用场景

使用方式

SimpleTrigger

固定时间间隔的调度任务(例如:每隔2小时执行1次)

通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔

CronTrigger

指定时间点的调度任务(例如:每天凌晨1:00执行1次

通过定义Cron表达式

/**
 * 参数3:cron表达式(定义执行时间)
 */
CronTrigger cronTrigger = new CronTrigger("myTrigger", "group", "* 35 15 ? * * ");

  • cron表达式

位置

字段含义

范围

允许的特殊字符

1

0~59

* /

2

分钟

0~59

* /

3

小时

0~23

* /

4

月份中的哪一天

1~31

* / ? L

5

月份

1~12 或 JAN~DEC

* /

6

星期几

1~7 或 SUN~SAT

* / ? L #

7

年份

1970~2099

* /

  • cron表达式的每个字段,都可以显式地规定一个值(如49)、一个范围(如1-6)、一个列表(如1,3,5)或者一个通配符(如*)
  • cron表达式特殊字符
    • “ * ”:表示每一个值,它可以用于所有字段
    • “ ? ”:该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值
    • “ - ”:中划线,表示一个范围
    • “ , ”:使用逗号间隔的数据,表示一个列表
    • “ / ”:通常表示为x/y,x为起始值,y表示值的增量
    • “ L”:可以指定指定月份和星期,比如星期指定5L,表示在最后一个星期4执行
    • “ #”:只能用与指定月份,用于指定第几个星期几,例如4#2,表示某月的第2个星期3
  • 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点每5分钟运行一次

  • 真实开发中,可以使用cron表达式在线生成
    • 在线生成网站:http://cron.qqe2.com/

spring整合quartz

  • XML方式
  • 注解方式
    • @Scheduled(cron="0/5 * * * * ? ")
  • 引入quartz的依赖
  • 在spirng的配置文件中添加约束,并开启task的注解扫描

xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"

<!--开启任务调度注解扫描-->
<task:annotation-driven/>

  • 项目中使用

/**
 * 10钟执行一次 刷新订单的状态 不对外公布
 */
@Scheduled(cron = "*0 0/10 * * * ?")
public void flushCancelOrderStatus() {
    ...   
}
 
/**
 * 2时执行一次 刷新订单的状态 不对外公布
 */
@Scheduled(cron = "0 0 0/2 * * ?")
public void flushOrderStatus() {
    ...
}

猜你喜欢

转载自blog.csdn.net/GoldWashing/article/details/81501885