勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了 Quartz的初认识(一),如果没有看过,请观看上一章

实现作业调度,用到了 JobDetail,Trigger,Scheduler 三个接口对象,我们讲解一下,这三个基本的API对象 。

一. Job方面的接口

一.一 Job接口

Quartz 框架提供了 org.quartz.Job 接口,开发者需要实现这个接口,让框架知道,开发者自定义的工作任务是什么。

package org.quartz;

public interface Job {
    void execute(JobExecutionContext context)
        throws JobExecutionException;
}

里面只有一个方法, execute()。

里面的参数 JobExecutionContext 对象,是 作业运行上下文对象,可以获取作业的相关信息。

一.二 JobExecutionContext

用于获取上下文对象的内容。

主要方法有:

有图片

一.三 JobBuilder

一.三.一 作用

是建造者模式, 通过 JobBuilder 来创建 JobDetail。

需要绑定 一.一 里面的作业类,来表示执行的是哪一个作业。

一个作业,可以被多个触发器触发, 一个作业,也可以被多次绑定,虽然同一个Job,执行的内容是一致的,但是作业运行上下文对象是不一样的,
为了区分不同的作业,需要给当前这个作业设置一个独一无二的id, 设置job的编号和组的编号,就是 JobKey。 job的编号是必须的,组的名称可以不设置。

主要方法有:

有图片

可以链式编程,方法返回的都是 this 当前对象 。

一.三.二 常用方法

方法签名作用
newJob(Class <? extends Job> jobClass)关联哪一个作业任务
withIdentity(String name, String group)设置job名称和组名
withDescription(String jobDescription)设置描述
usingJobData(String dataKey, String value)传递数据
build()创建JobDetail 对象

一.四 JobKey

存储 JobBuilder 创建时,传递过来的 job编号和组名

package org.quartz;
import org.quartz.utils.Key;
public final class JobKey extends Key<JobKey> {

    private static final long serialVersionUID = -6073883950062574010L;
    
    public JobKey(String name) {
        super(name, null);
    }

    public JobKey(String name, String group) {
        super(name, group);
    }

    public static JobKey jobKey(String name) {
        return new JobKey(name, null);
    }
    
    public static JobKey jobKey(String name, String group) {
        return new JobKey(name, group);
    }

}

JobBuilder 传递过来时,withIdentity(name,group)

 public JobBuilder withIdentity(String name, String group) {
        key = new JobKey(name, group);
        return this;
 }

一.五 JobDataMap

最终继承 java.util.Map 接口,也是 Key-value 类型的 Map接口, 用于存放数据。

有图片

一.六 JobDetail

真正被调用的接口, 通过JobBuilder 通过建造者模式创建出来,可以获取它的相关信息

有图片

Job方面的接口,大概就是这六个。

二. Trigger 方面的接口

二.一 TriggerBuilder

二.一.一 作用

建造者模式,用于创建 Trigger。

可以设置 开始的时间, 可以设置立即启动, 可以设置结束的时间,也可以设置Trigger的标识名和组名,可以设置调度器(多长时间运行一次,运行几次)。 调度器与开始的时间进行关联, 构建 什么时候开始执行,多长时间运行一次,运行几次,一个完整的任务链。

在这里插入图片描述

可以链式编程, 返回的是 this 当前对象。

二.一.二 常用方法

方法签名作用
newTrigger()获取TriggerBuilder 实例,构建方法被私有了
withIdentity(String name, String group)设置触发器名称和组名
startAt(Date triggerStartTime)设置开始时间
startNow()立即开始
endAt(Date triggerEndTime)设置结束时间
withSchedule(ScheduleBuilder schedBuilder)设置Schedule
usingJobData(String dataKey, String value)传输数据
build()创建 Trigger对象

二.二 TriggerKey

Trigger 触发器的标识, 与JobKey 类似

package org.quartz;

import org.quartz.utils.Key;

public final class TriggerKey extends Key<TriggerKey> {
  
    private static final long serialVersionUID = 8070357886703449660L;

    public TriggerKey(String name) {
        super(name, null);
    }

    public TriggerKey(String name, String group) {
        super(name, group);
    }

    public static TriggerKey triggerKey(String name) {
        return new TriggerKey(name, null);
    }
    
    public static TriggerKey triggerKey(String name, String group) {
        return new TriggerKey(name, group);
    }
    
}

TriggerBuilder 传递过来时,withIdentity(name, group)

 public TriggerBuilder<T> withIdentity(String name, String group) {
        key = new TriggerKey(name, group);
        return this;
  }

二.三 ScheduleBuilder

有四个实现类

有图片

但常用的,只有两个, SimpleScheduleBuilder 和 CronScheduleBuilder

SimpleScheduleBuilder 是通过方法来定义,隔多长时间执行一次,执行几次。 什么时候开始执行,在 TriggerBuilder 里面定义。

CronScheduleBuilder 是通过 cron 表达式,来定义多长时间执行一次,执行几次和什么时候开始执行。

二.四 SimpleScheduleBuilder

二.四.一 作用

里面定义了很多方法, 有second(秒),minute(分钟),hour(小时) 来定义,每隔多长时间再次执行一次, 也定义了执行的次数。

如果上升到天,月和周的话,就需要开发者自己进行处理时间了。

以second 秒进行举例

有图片

提供了两种方式, 静态方法和普通方法设置时间间隔和次数。

发现,以 repeatSecondlyForever(int seconds) 为例:

public static SimpleScheduleBuilder repeatSecondlyForever(int seconds) {

    return simpleSchedule()
        .withIntervalInSeconds(seconds)
        .repeatForever();
}

内部调用了非静态的方法。

读者可以自行进行选择使用哪一种方式, 比较喜欢静态的方式,写起来简单。

二.四.二 常用方法

以second 秒 进行举例。

方法签名作用
static simpleSchedule()获取实例
static repeatSecondlyForever()每隔1s,重复执行
static repeatSecondlyForever(int seconds)每隔seconds秒,重复执行
static repeatSecondlyForTotalCount(int count)每隔1s,执行count 次
static repeatSecondlyForTotalCount(int count, int seconds)每隔seconds秒,执行count 次
withIntervalInSeconds(int intervalInSeconds)每隔intervalInSeconds秒
withRepeatCount(int triggerRepeatCount)执行triggerRepeatCount 次
repeatForever()重复执行

提示: 当使用普通方法时,repeatForever()不能单独使用,withRepeatCount(int triggerRepeatCount)也不能单独使用,

Exception in thread “main” org.quartz.SchedulerException: Repeat Interval cannot be zero

必须要与 withIntervalInSeconds(int intervalInSeconds) 方法同时使用。

但可以单独使用 withIntervalInSeconds(int intervalInSeconds) 方法,这时只执行一次。

二.五 CronScheduleBuilder

关于 CronScheduleBuilder, 后面会有专门的章节进行讲解。

三. Scheduler 方面的接口

三.一 StdSchedulerFactory

工厂模式,用于创建 调度 Scheduler,有一个方法 getDefaultScheduler(), 用于获取 Scheduler

 public static Scheduler getDefaultScheduler() throws SchedulerException {
        StdSchedulerFactory fact = new StdSchedulerFactory();

        return fact.getScheduler();
}

由于 StdSchedulerFactory 的构造方法是 public, 所以有两种方式可以获取 Scheduler

三.一.一 静态方法 getDefaultScheduler()获取

	Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();

三.一.二 构造方法 获取

	StdSchedulerFactory stdSchedulerFactory=new StdSchedulerFactory();
	Scheduler scheduler=stdSchedulerFactory.getScheduler();

静态方法内部实际调用的是构造方法。

建议采用第一种方式 进行获取 Scheduler

三.二 Scheduler

用于关联 JobDetail 和 Trigger, 并且可以启动和停止调度。

有图片


谢谢您的观看!!!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐