Quart 的 API

Quartz API 中的关键接口和类如下:

  • IScheduler—与调度器(scheduler)进行交互的主要 API;
  • IJob—被组件继承和实现,由调度器来执行的接口;
  • IJobDetail—通常被用于定义任务实例;
  • ITrigger—对于给定的任务定义出了它将被执行的时间序列的组件;
  • JobBuilder—通常用来定义(或创建) JobDetail 实例,此实例用于定义任务实例;
  • TriggerBuilder—通常用来定义(或创建)触发器实例。

在本教程中,为了提高可读性以下术语交替使用:IScheduler 和 Scheduler,IJob 和 Job,IJobDetail 和 JobDetail,ITrigger 和 Trigger。

调度器创建后的生命周期是有限的,通过调用调度工厂 (SchedulerFactory) 的 Shutdown() 方法可以关闭调度器。IScheduler 接口创建后即可进行任务和触发器的添加、删除以及列表操作,并且可以执行调度计划相关的其他操作 (例如暂停一个触发器)。然而,就像在《使用Quartz》中所讲的那样,只有在调用 Start() 方法之后调度器才会真正对触发器起作用 (执行任务)。

Quartz 提供的 “builder” 类定义了一种领域专用语言 (DSL,也经常指代“流接口”)。在上一节中已经看到了它的例子,现在我们把它展示在下面:

// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("myJob", "group1") // name "myJob", group "group1"
    .Build();
   
// Trigger the job to run now, and then every 40 seconds
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(40)
        .RepeatForever())           
    .Build();
   
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);

上面的代码块展示了使用 JobBuilder 创建任务的定义并使用流接口创建了任务 (IJobDetail)。同样,使用针对给定触发器类型的 TriggerBuilder 的流接口和扩展方法创建了触发器。可能的时间计划扩展方法如下:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

DateBuilder 类包含的很多方法可以让我们很容易地构造特定时间点的 DateTimeOffset 实例 (例如代表下一个偶数小时的时间,换句话说就是如果现在是 9:43:27 那么它将返回 10:00:00)。

任务和触发器

任务就是实现了 IJob 的类,里面只有一个简单的方法:

IJob 接口:

namespace Quartz
{
    public interface IJob
    {
        void Execute(JobExecutionContext context);
    }
}

当任务的触发器触发以后,调度器的一个工作线程将会调用 Execute(..) 方法。传递到这个方法的 JobExecutionContext 对象提供了一个任务实例,这个实例包含以下运行时环境:一个运行当前任务的调度器的句柄,触发当前任务的触发器的句柄,当前任务的 JobDetail 对象,以及其他几个对象。

调度器加载任务后 Quartz.NET 的客户端 (即我们的应用程序) 会创建 JobDetail 对象。这个对象包含了任务的各种属性设置,以及一个 JobDataMap——它可以用来存储指定任务类型的状态信息。JobDetail 是任务对象的本质,我们会在下一节更详细地讨论它。

触发器用来触发 (或者叫“点火”) 任务的执行操作。当你想要调度一个任务的时候,你需要初始化一个触发器并按照你想要的调度计划来调整它的属性。触发器也可能有一个关联的 JobDataMap,这对于向触发器触发操作指定的任务传递参数来说很有用。Quartz 附带了一些不同的触发器类型,但是通常情况下用的最多的是SimpleTrigger(接口是ISimpleTrigger) 以及 CronTrigger(接口是ICronTrigger)。

如果你需要在指定时间点仅执行一次,或者在指定时间内重复多次并且在每执行前延迟特定时间的任务,使用SimpleTrigger将会很方便。如果你想让触发器有类似于日历的调度计划,CronTrigger将会很合适,例如“每周五下午”或者“每个月第10天的10:15”。

为什么要有任务和触发器?很多任务调试工具都没有将触发器和任务的概念分离。一些组件简单地将任务当作附带一点任务标识的执行时间(或者计划)。还有一些组件很像是Quartz的任务和触发器的结合。但是当我们开发Quartz时, 我们决定将调度计划和在调度计划内将要执行的操作分离开。在我们看来这样做有很多好处。

例如:任务可以独立于触发器创建并存储到任务调度器中,并且可以将多个触发器关联到同一个任务上。另一个松耦合的好处是对于调度器中保留的任务,当与之关联的触发器过期之后,可以不用重新定义这个任务就对它再次进行调度安排;同样的你也可以修改或替换一个触发器而不用重新定义与它关联的任务。

标识

当任务和触发器在Quartz的调度器中注册时就分配了标识主键。任务和触发器的主键(JobKey 和TriggerKey)对于将其组织归并到某个分组并进行分类是非常有用的,例如将任务分为“报表任务”或“维护任务”。组内的任务或触发器的主键名称不能重复,换句话说即任务或触发器的名称以及组名结合在一起就是完整主键(或者标识)。

原文:《Lesson 2: Jobs And Triggers》

(02) 任务(Jobs)和触发器(Triggers)的更多相关文章

  1. 运维监控-使用Zabbix Server 创建触发器Triggers

    运维监控-使用Zabbix Server 创建触发器Triggers  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.点击相应主机的触发器 2>.点击创建触发器 ...

  2. (20)zabbix触发器triggers

    触发器是什么 触发器(triggers)是什么?触发器使用逻辑表达式来评估通过item获取到得数据是处于哪种状态,item一收回数据,讲解任务交给触发器去评估状态,明白触发器是怎么一回事了把?在触发器 ...

  3. 老猿学5G:融合计费基于QoS流计费QBC的触发器Triggers

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 SMF中的功能体CTF在用户上网时达到一定条件就会向CHF上报流量,而CTF什么时候触发流量上报是由CTF中的触发器来控制的.在<老猿学5G: ...

  4. 老猿学5G:融合计费基于流计费的触发器Triggers

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 每个触发条件都是一个可计费事件.SMF中的功能体CTF在用户上网时达到一定条件就会向CHF上报流量,而CTF什么时候触发流量上报是由CTF中的触发器 ...

  5. postgreSQL PL/SQL编程学习笔记(五)——触发器(Triggers)

    Trigger Procedures PL/pgSQL can be used to define trigger procedures on data changes or database eve ...

  6. Quartz Scheduler 开发指南(1)

    Quartz Scheduler 开发指南(1) 原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/ 实例化调度程序( ...

  7. Quartz的API简介及Jobs和Trigger介绍

    Quartz的API: 主要api: The key interfaces of the Quartz API are: Scheduler - the main API for interactin ...

  8. quartz2.3.0(二)触发器Trigger花式Scheduler调度job

    任务类 package org.quartz.examples.example2; import java.util.Date; import org.slf4j.Logger; import org ...

  9. 自学Zabbix3.6.1-触发器triggers创建

    1. 触发器概念 触发器(triggers)是什么?触发器使用逻辑表达式来评估通过item获取到得数据是处于哪种状态,item一收回数据,讲解任务交给触发器去评估状态,明白触发器是怎么一回事了把?在触 ...

随机推荐

  1. 机器学习理论基础学习1——频率派 VS 贝叶斯派

    频率派 贝叶斯派 theta是个未知的常量,X是随机变量, theta是个随机变量,X是随机变量 MLE最大似然估计 MAE最大后验概率 统计机器学习,优化问题 1)建立模型.概率 2)定义损失函数 ...

  2. Bootstrap学习笔记-栅格系统

    栅格系统的原理就是在这个界面中这个栅格被分成12个格子,你根据自己的想要的布局就把这个界面分割成你想要的部分就行了.一般如果我们用电脑作为显示器的我们用的样式是col-md 如果你用的显示期变小的情况 ...

  3. cxf-webservice完整示例

    最近一段时间研究webservice,一般来说,开发java的Webservice经常使用axis2和cxf这两个比较流行的框架 先使用cxf,开发一个完整示例,方便对webservice有一个整体的 ...

  4. uva10905

    /* 很好的字符串 比较方法 很多个字符串 组成的 数字 需要最大 然后 比较 a和b 是 比较a+b 和b+a 的大小 */ #include<cstdio> #include<s ...

  5. FastJson(阿里巴巴)基础

    一.所需jar包: fastjson-x.x.xx.jar(本例使用fastjson-1.1.36.jar). 二.解析转化: 1.json字符串  < ------ >  js trin ...

  6. mysql索引使用策略及优化

    原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 索引使用策略及优化 MySQL的优化主要分为结构优化(Schem ...

  7. 彻底明白Flink系统学习5:window、Linux本地安装Flink

    http://www.aboutyun.com/thread-26393-1-1.html 问题导读 1.如何在window下安装Flink? 2.Flink本地安装启动命令与原先版本有什么区别? 3 ...

  8. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  9. python3.4学习笔记(十) 常用操作符,条件分支和循环实例

    python3.4学习笔记(十) 常用操作符,条件分支和循环实例 #Pyhon常用操作符 c = d = 10 d /= 8 #3.x真正的除法 print(d) #1.25 c //= 8 #用两个 ...

  10. Elasticsearch 疑难解惑

    Elasticsearch是如何实现Master选举的? Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单 ...