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. Integer.valueOf方法的源码解读

    public class IntegerDemo { public static void main(String[] args) { Integer i01 = ; ; Integer i03 = ...

  2. [py]彻底细究web框架的wsgi+逻辑处理模块

    wsgi逻辑结构初探 参考: 这里图很精彩,wsgi写的不错 web框架 = wsgi+逻辑处理app 接收请求,返回对应的内容 python wsgiref实现了wsgi规范. from wsgir ...

  3. oracle修改内存使用和性能调节,SGA

    最近装了oracle,电脑实在太卡了,想要限制内存使用,结果碰到一系列问题: 要用SYS帐户登录,修改SGA使用,结果不知道SYS密码.用SYSTEM帐户权限不够. 试了几条语句后,有几个文件修改不了 ...

  4. 国内maven库

    国内maven库 <mirrors> <mirror> <id>CN</id> <name>OSChina Central</name ...

  5. pycharm Unresolved reference 无法引入包

    1. 问题描述: 在项目中P存在文件夹A.B.C,A有文件夹a和b,在a中引入b的一个类, a.py: from b import func1 虽然运行成功,但是在Pycharm中显示: Unreso ...

  6. VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)

    前面两节鸡啄米讲了树形控件Tree Control,本节开始讲解标签控件Tab Control,也可以称为选项卡控件. 标签控件简介 标签控件也比较常见.它可以把多个页面集成到一个窗口中,每个页面对应 ...

  7. Python: 列表,元组,字典的区别

    Python中有3种内建的数据结构:列表,元组和字典 1.列表 list是处理一组有序项目的数据结构,即可以在一个列表中存储一个序列的项目.列表中项目应该包括在方括号中,这样python就知道是在指明 ...

  8. Ignite初探

    Guava是一个很方便的本地缓存工具,但是在多节点处理的过程中,本地缓存无法满足数据一致性的问题.分布式缓存Ignite很好的解决了数据一致性,可靠性,事务性等方面的问题. Ignite支持分区方式和 ...

  9. python openpyxl 2.5.4 版本 excel常用操作封装

    最近搭框架用的openpyxl 2.5.4版本,之前封装的函数有些提示不推荐使用了,我做了一些更新: 代码: # encoding=utf-8 from openpyxl import load_wo ...

  10. Javassist

    Javassist 实现动态代理 javassist 是一款非常优秀的Java 字节码引擎工具,能够在运行时编译.生成Java Class.