Quartz官方教程翻译系列-Lesson 2

字节踏月客
• 阅读 1846
原文地址: http://www.quartz-scheduler.o...

第二课: Quartz API ,Jobs[任务] 和 Triggers[触发器]

Quartz API 的关键接口:

  • Scheduler - 任务调度的主要API
  • Job - 基于组件实现的接口,通过任务调度实现你想要的执行
  • JobDetail -用于定义Jobs的实例
  • Trigger - 一个组件,用于定义一个指定Job的任务调度怎样被执行。
  • JobBuilder - 用于定义/构建 JobDetail 实例,(JobDetail) 定义 Jobs 实例。
  • TriggerBuilder - 用于定义/构建触发器实例.

一个任务调度的生命周期总是开始于通过SchedulerFactory 创建,终结于它的 shutdown() 方法。
一旦创建了Scheduler接口,就可以使用它添加、删除和列出作业和触发器,并且执行其他任务调度相关的操作(如暂停一个触发器)。然而,任务调度在调用start() 方法开始之前,不会被触发器触发执行job,如第一课的展示。

Quartz 提供"builder" 类去定义领域特定语言(或 DSL,同样有时会被称为流接口)。在之前的课程你已经看到它的例子,我们在这里再呈现一部分:


// 定义一个 job 并绑定到我们的 HelloJob 类
  JobDetail job = newJob(HelloJob.class)
      .withIdentity("myJob", "group1") // 名称 "myJob", 组别 "group1"
      .build();

  // 触发 job 立刻还行,每40秒执行
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

  // 告诉 quartz 任务调度使用我们的 trigger
  sched.scheduleJob(job, trigger);

构建作业定义的代码块使用的是从JobBuilder类静态导入的方法。同样地,构建触发器的代码使用的是从TriggerBuilder导入的方法,SimpleScheduleBuilder·也是。


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.*;

各种各样的 “ScheduleBuilder” 类提供方法关联不同类型的任务调度。

DateBuilder 类包含多种方法用于轻松构建 特殊事件点的java.util.Date 实例(正如表示下一个整数时间的date,换个说法就是,如果现在是 9:43:27 ,那么指定10:00:00)

任务 和 触发器

一个任务是一个 Job 接口的实例,仅又一个简单的方法:
Job 接口


package org.quartz;

  public interface Job {

    public void execute(JobExecutionContext context)
      throws JobExecutionException;
  }

当任务的触发器触发时(稍后再详述),exectue(...) 方法被一个执行调度的工作线程调用。JobExecutionContext 对象传递给这个方法提供带有运行环境信息的任务实例-执行它调度的句柄,触发执行的触发器句柄,任务的 JobDetail 对象,还有一些项。

JobDetail 对象由 Quartz 客户端(你的程序)在任务被加到任务调度时创建。它包含各种不同的任务属性设置,好像 JobDataMap ,可以用来用于存储 Job 类的给定实例的状态信息。它基本上是定义了job实例,更详细讨论留在下一课。

Trigger 对象用来触发任务的执行(发射)。当你安排一个任务,你实例化一个触发器并且调整他的属性提供给你希望的调度。触发器可能同样有一个 JobDataMap 与他们关联- 用来传递参数给一个任务用来指定触发器的点燃。Quartz有几种不同的触发来写,单最常用的是 SimpleTriggerCronTrigger

SimpleTrigger 很易用,如果你只是需要一次性的执行(仅仅在一个指定时间单次执行),或者你需要点燃一个任务在一个给定的时间,并重复 N 次,伴随 延迟 T 在执行之间。CronTrigger 对于你想要基于日历类似的调度很有用,好像"每个星期五,在中午"或者“在10:15 在每个月的10号”。

为什么是任务和触发器?很多任务调度没有分离任务和触发器的观念。有一些定义一个'任务'只是简单地一个执行时间(或者安排) 顺着一些简单的工作标识。其他的更多像 Quartz的任务 和触发对象的联合。在开发 Quzrtz时,我们决定更合理去创造一个任务调度与任务调度要完成的工作。这样有(在我们看来)更多好处。

举例,任务可以独立于触发器被创建并存储在任务调度中,并且多个触发器可以关联同样的任务。这种松耦合的另一个好处是能够配置任务在相关触发器过期后保留在调度器中,因而可以晚点再重新调度,而不需要重新定义它。它还允许您修改或替换触发器,而不必重新定义其关联的作业。

特性

任务和触发器会被给予识别键当他们注册到Quartz调度。Jobs 和 Triggers的键(JobKey 和 TriggerKey)允许将它们放入组中,这对于组织作业非常有用,并将触发器分为报告作业和维护作业等类别。作业或触发器的键的名称部分在组中必须是唯一的-换句话说,作业或触发器的完整键(或标识符)是名称和组的组合。

你现在对于Jobs 和 Triggers 已经有一个大概的概念,可以学习到更多关于他们的内容在第三课: 关于 Jons 和 J偶读Detail的更多内容 和第四课: 更多关于触发器的内容。

本文由博客一文多发平台 OpenWrite 发布!
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
AssemblyScript 入门指南[每日前端夜话0xEB]
每日前端夜话0xEB每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2459 字预计阅读时间:10分钟作者:DannyGuo翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/b880277c594152a503
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Node.js 12中的ES模块[每日前端夜话0x9E]
每日前端夜话0x9E每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2552字预计阅读时间:10 分钟作者:BrianDeSousa翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/2ccaf94cecd3
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Dubbo爆出严重漏洞!可导致网站被控制、数据泄露!附解决方案
http://dy.163.com/v2/article/detail/F5FPIFRU0511Q1AF.html  !(http://dingyue.ws.126.net/2020/0216/125ec4c4p00q5rcrs0019d200ig009qg00ig009q.png)  来源:华为云  原文地址:https://w
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
字节踏月客
字节踏月客
Lv1
他心里若一直有个人我怎么闯都让他无动于衷
文章
4
粉丝
0
获赞
0