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. vue学习之六路由系统

    一.vueRouter实现原理 VueRouter的实现原理是根据监控锚点值的改变,从而不断修改组件内容来实现的,我们来试试不使用VueRouter,自己实现路由控制,如下代码: <!DOCTY ...

  2. [参考资料] 80个Python经典资料(教程+源码+工具)汇总

    AD : 2018重磅地面课程<机器读心术之语音识别前沿实战特训营>,迈向人工智能新高度 [专题推荐]Python系列英文原版电子书 http://down.51cto.com/zt/10 ...

  3. [LeetCode] 301. Remove Invalid Parentheses_Hard tag:BFS

    Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...

  4. javascript console自动点击页面元素

    原文地址https://jingyan.baidu.com/article/0a52e3f41c0b0abf63ed726d.html 这里拿百度音乐VIP兑换页面来做演示. 首先打开百度音乐VIP兑 ...

  5. ASP.NET Post方式提交

    public static string SendMsg(string fxPhone, string fxPassword, string toPhone, string msg) { try { ...

  6. C#在splitContainer1控件和panel控件中显示窗体

    现在有两个窗体 Form1 和Form2 Form1中有控件splitContainer1 和panel .控件.我们希望Form2在splitContainer1或者panel控件中显示 1:首先看 ...

  7. ambari集成impala

    1.查看hdp版本,可在ambari-agent节点上查看 VERSION=`hdp-select status hadoop-client | sed 's/hadoop-client - \([0 ...

  8. Django框架----models.py(数据库操作文件)

    利用一个中间模块 帮助我们连接数据库,写SQL语句,执行SQL语句,拿到结果 models.py 一.数据的对应关系 1. 类 ---> 表 2. 对象 ---> 数据行 3. 属性 -- ...

  9. nginx做http向https的自动跳转

    在访问百度时,在浏览器输入www.baidu.com会自动跳转到https://www.baidu.com不用人工干预,nginx也可以做这样的自动跳转! 首先让nginx服务器监听两个端口,分别是8 ...

  10. dba和运维专家们说有丰富的大型分布式系统架构设计经验纯属扯淡

    如果,一开始就从事dba和运维的专家们说他们有丰富的大型分布式系统架构设计经验,那纯属扯淡.除非,他们从是从开发专家或者架构师转型而来,那么他们才有资格说自己有丰富的大型分布式系统架构设计经验. 运维 ...