Quartz教程二:API,Job和Trigger
原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞
本系列教程由quartz-2.2.x官方文档翻译、整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正;有兴趣研究源码的同学,可以参考我对quartz-core源码的注释(进行中)。
Quartz APIQuartz API核心接口有:
Scheduler – 与scheduler交互的主要API; Job – 你通过scheduler执行任务,你的任务类需要实现的接口; JobDetail – 定义Job的实例; Trigger – 触发Job的执行; JobBuilder – 定义和创建JobDetail实例的接口; TriggerBuilder – 定义和创建Trigger实例的接口;Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job),见教程一。
Quartz提供的“builder”类,可以认为是一种领域特定语言(DSL,Domain Specific Language)。教程一中有相关示例,这里是其中的代码片段:(校对注:这种级联的API非常方便用户使用,大家以后写对外接口时也可以使用这种方式)
// define the job and tie it to our HelloJob class JobDetail job = newJob(HelloJob.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);
定义job的代码使用的是从JobBuilder静态导入的方法。同样,定义trigger的代码使用的是从TriggerBuilder静态导入的方法 。 另外,也导入了SimpleSchedulerBuilder类的静态方法;
从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.*;
SchedulerBuilder接口的各种实现类,可以定义不同类型的调度计划(schedule);
DateBuilder类包含很多方法,可以很方便地构造表示不同时间点的java.util.Date实例(如定义下一个小时为偶数的时间点,如果当前时间为9:43:27,则定义的时间为10:00:00)。
Job和Trigger一个job就是一个实现了Job接口的类,该接口只有一个方法:
Job接口:
package org.quartz; public interface Job { public void execute(JobExecutionContext context) throws JobExecutionException; }
当job的一个trigger被触发后(稍后会讲到),execute()方法会被scheduler的一个工作线程调用;传递给execute()方法的JobExecutionContext对象中保存着该job运行时的一些信息 ,执行job的scheduler的引用,触发job的trigger的引用,JobDetail对象引用,以及一些其它信息。
JobDetail对象是在将job加入scheduler时,由客户端程序(你的程序)创建的。它包含job的各种属性设置,以及用于存储job实例状态信息的JobDataMap。本节是对job实例的简单介绍,更多的细节将在下一节讲到。
Trigger用于触发Job的执行。当你准备调度一个job时,你创建一个Trigger的实例,然后设置调度相关的属性。Trigger也有一个相关联的JobDataMap,用于给Job传递一些触发相关的参数。Quartz自带了各种不同类型的Trigger,最常用的主要是SimpleTrigger和CronTrigger。
SimpleTrigger主要用于一次性执行的Job(只在某个特定的时间点执行一次),或者Job在特定的时间点执行,重复执行N次,每次执行间隔T个时间单位。CronTrigger在基于日历的调度上非常有用,如“每个星期五的正午”,或者“每月的第十天的上午10:15”等。
为什么既有Job,又有Trigger呢?很多任务调度器并不区分Job和Trigger。有些调度器只是简单地通过一个执行时间和一些job标识符来定义一个Job;其它的一些调度器将Quartz的Job和Trigger对象合二为一。在开发Quartz的时候,我们认为将调度和要调度的任务分离是合理的。在我们看来,这可以带来很多好处。
例如,Job被创建后,可以保存在Scheduler中,与Trigger是独立的,同一个Job可以有多个Trigger;这种松耦合的另一个好处是,当与Scheduler中的Job关联的trigger都过期时,可以配置Job稍后被重新调度,而不用重新定义Job;还有,可以修改或者替换Trigger,而不用重新定义与之关联的Job。
将Job和Trigger注册到Scheduler时,可以为它们设置key,配置其身份属性。Job和Trigger的key(JobKey和TriggerKey)可以用于将Job和Trigger放到不同的分组(group)里,然后基于分组进行操作。同一个分组下的Job或Trigger的名称必须唯一,即一个Job或Trigger的key由名称(name)和分组(group)组成。
对于Job和Trigger,你现在有一个大概的了解了,更详细的介绍参见教程三和教程四。
SpringBoot2.x系列教程12--SpringBoot中构建RESTful风格的API接口 在前面的章节中,壹哥 给大家介绍了在前后端不分离的开发模式中,SpringBoot是如何处理静态资源的。但是现在真正的企业开发中,前后端分离才是比较流行的开发模式。而在这种开发模式中,前端团队负责UI界面,后端团队负责实现Web接口和核心业务逻辑,两个团队之间密切配合,共同完成项目开发。 前端需要调用后端的Web接口,而后端团队也需要把数据以合适的格式传递给前端,现在主流的数据载体是用JSON格式。另外因为Web接口是后端团队开发的,前端团队并不知道这个Web接口的定义和使用规则,所以现在比较流行基于RESTful风格的Web接口设计,这样设计出来的Web接口就都遵循着一定的规范,前端
Spring Security系列教程11--Spring Security核心API讲解 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发。但是前面章节的内容,属于让我们达到了 会用 的层级,但是 为什么这么用 ,很多小伙伴就会一脸懵逼了。对于技术学习来说,我们追求的不仅要 知其然 ,更要 知其所以然 ! 本篇文章中,壹哥 就跟各位小伙伴一起来了解剖析Spring Security源码内部,实现认证授权的具体过程及底层原理。接下来请各位做好心理准备,以下的学习过程可能会让你心理 稍有不适 哦,因为每次看源码都懵懵的...... 一. Spring Security认证请求完整
微信程序开发系列教程(四)使用微信API创建公众号自定义菜单 大家可能经常看到一些微信公众号具有功能强大的自定义菜单,点击之后可以访问很多有用的功能。 这篇教程就教大家如何动手做一做。 这个教程最后实现的效果是:创建一个一级菜单 UI5 , 点击之后弹出两个二级菜单,如下图蓝色区域所示。每个二级菜单都能完成一些任务。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- ABP源码分析三十七:ABP.Web.Api Script Proxy API
- 制作动态logo教程
- Django篇系列教程学习
- Excel怎么增加撤销操作的次数?Excel增加可撤销次数教程
- H7-TOOL的LUA小程序教程第2期:变量,循环,函数,条件语句和字符串相关API
- 【第3版emWin教程】第10章 emWin6.x模拟器的使用方法(VC6.0)
- 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API
- 【STM32H7教程】第78章 STM32H7的QSPI总线基础知识和HAL库API
- 【STM32H7教程】第50章 STM32H7的LCD控制器LTDC基础知识和HAL库API
- 【STM32H7教程】第44章 STM32H7的ADC基础知识和HAL库API
- 【STM32H7教程】第40章 STM32H7的BDMA基础知识和HAL库API
- 【STM32H7教程】第36章 STM32H7的LPTIM低功耗定时器基础知识和HAL库API
- 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API
- SAP UI5 应用开发教程之四十五 - 如何在 SAP UI5 应用里使用 jQuery 和原生的 DOM API
- 微信程序开发系列教程(四)使用微信API创建公众号自定义菜单
- 【单片机仿真】(二)keil 安装教程
- python微信机器人制作教程+源码
- 【Web API系列教程】1.2 — Web API 2中的Action Results
- ExtJs自学教程(1):一切从API開始
- ExtJs自学教程(1):一切从API開始
- ExtJs自学教程(1):一切从API開始
- 【2023最新教程】用Jenkins+Docker+Maven+Git实现持续集成 (超详细)
- 电商小程序实战教程-订单管理
- ClickHouse管理工具—ckman教程(3)从ckman源码分析部署集群时的主要步骤
- Linux下CMake简明教程(八) 添加编译选项