Quartz- Quartz API以及Jobs 和Triggers介绍

举报
小工匠 发表于 2021/09/11 01:31:33 2021/09/11
【摘要】 文章目录 Quartz APIJobs 和 Triggers唯一标识 Quartz API Quartz API 主要包含了以下接口 Scheduler – 调度器,任务调度的主 AP...

Quartz API

Quartz API 主要包含了以下接口

  • Scheduler – 调度器,任务调度的主 API。

  • Job – 由调度器调度的任务需要实现的接口。

  • JobDetail – 用于定义任务的实例。

  • Trigger – 用于定义需要执行的任务和任务的执行时间。

  • JobBuilder – 用于定义/创建 JobDetail 实例。

  • TriggerBuilder – 用于定义/创建 Trigger 对象。


Scheduler(调度器)的生命周期由 SchedulerFactory 创建 Scheduler 开始到调用 shutdown() 结束。

一旦创建了 Scheduler 实例,就可以新增,移除,查看 Job 和 Trigger,和执行其它调度相关工作(例如暂停 Trigger)。

如果 Scheduler 没有调用 start() 方法,那么将不会执行任何 Trigger 上的任务

Quartz 定义了 builder 类,它们定义了 Domain Specific Language(DSL,有时也成为“流式接口”)。

如下所示

 // define the job and tie it to our HelloJob class
  JobDetail job = newJob(MyJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .build();

  // Trigger the job to run now, and then every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

  // Tell quartz to schedule the job using our trigger
  sched.scheduleJob(job, trigger);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

上面代码中:
创建 job 使用到的方法来自静态导入的 JobBuilder 类,
创建 Trigger 的方法来自静态导入的 TriggerBuilder
同样也静态导入了 SimpleScheduleBuilder

静态导入的 DSL 可以通过下面语法定义:

import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.CalendarIntervalScheduleBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.DateBuilder.*;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ScheduleBuilder 有多个变体,用于定义不同类型的周期。

这里写图片描述

DateBuilder 中包含了大量的方法方便创建 java.util.Date 实例来指定时间。


Jobs 和 Triggers

任务需要实现 Job 接口,接口中只有一个方法:

package org.quartz;
 
  public interface Job {
 
    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当任务的 Trigger 被触发,任务的 execute 方法将会由调度器的一个工作线程调用。传入这个方法的 JobExecutionContext 对象用于提供任务运行环境的信息(包含了一个 Scheduler 的句柄,一个Trigger 的句柄,一个 JobDetail 的句柄和几个其它项)。

JobDetail 由 Quartz 客户端创建(你自己编写)。它包含了大量的任务属性设置和 JobMetaMap 对象(可用于存储任务的状态信息)。这个类本质上来说是用于定义 Job 对象。


Trigger 对象用于触发任务的执行。它定义了任务的执行时间。当你创建了一个 Trigger,你需要提供你需要的时间表(schedule)用于控制任务的执行。Trigger 可能还包含了 JobDataMap 对象,当你需要传递参数给 Job 的时候,这个类就相当有用。Quartz 提供了几个 Trigger 的实现,其中最常用的是 SimpleTrigger 和 CronTrigger。

SimpleTrigger 用于执行某个时间点执行一次的任务,或用于在某个时间执行一次任务,并且在 T 周期重复执行 N 次。CronTrigger 用于基于日历的任务,例如“每周五中午”或“每个月10号上午10点15分”执行。

为什么需要 Job 和 Trigger?有些任务调度方案没有分离 job 和 trigger,为什么 Quartz 需要分别定义 Job 和 Trigger 呢?主要基于以下考虑。

多个 Job 可以保存到同一个 Trigger,多个 Trigger 也可以关联到相同的 Job。这种松耦合的设计的另外一个好处是可以在 trigger 过期后配置任务到调度器中,方便以后重新开始任务,而不用再次定义任务。也允许在不更换任务的情况下更改和替换 Trigger。


唯一标识

Jobs 和 Triggers 可以使用 Quartz 调度器注册一个唯一标识。Job 和 Trigger 的键(JobKey 和 TriggerKey)允许进行分组,这对于任务和触发器来说非常易于组织成像“报表任务”或“维护任务”这样的分组。 分组中的键必须唯一。

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/78169081

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。