• Quartz.Net


    Lesson 2: 任务和触发器

    本系列文章是官方3.x文档的翻译,原文地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.html
    目录:
    Lesson 1: 使用Quartz
    Lesson 2: 任务和触发器
    Lesson 3: Jobs & JobDetails详细介绍
    Lesson 4: Triggers详细介绍

    Quartz API

    Quartz API的主要接口和类如下:

    • IScheduler - 和调度器交互的主要API
    • IJob - 调度器会执行实现这个接口的实例
    • IJobDetail - 用来定义任务的实例
    • ITrigger - 定义任务执行安排的组件
    • JobBuilder - 用来定义/构造JobDetail的实例,其中JobDetail的实例定义Jobs的实例
    • TriggerBuilder - 用来定义/构造Trigger的实例

    在本文中,为了可读性,下列说法可互换: IScheduler 和 Scheduler, IJob 和 Job, IJobDetail 和 JobDetail, ITrigger 和 Trigger.

    一个调度器的生命周期,从通过SchedulerFactory创建开始,到调用它的Shutdown()方法结束。一个IScheduler实现后,可以使用添加、删除、列出任务和触发器,或者其他调度相关的操作(例如暂停一个触发器)。然而,如Lesson 1里讲到的,一个调度器不会真正触发任务触发器(执行任务)直到调用 Start()方法启动它。

    Quartz提供定义为领域特定语言(DSL,有时称为“流接口(fluent interface)”)的“构建者(builder)”类。在上一课中,你看到了它的一个例子,在这里我们再看其中一部分。

    	// 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
    	await sched.scheduleJob(job, trigger);
    

    这段代码中,使用JobBuilder定义job时,使用了流接口去构建IJobDetail。同样,使用TriggerBuilder定义trigger时,使用了流接口和返回trigger类型的扩展方法。可用的的调度扩展方法有:

    • WithCalendarIntervalSchedule
    • WithCronSchedule
    • WithDailyTimeIntervalSchedule
    • WithSimpleSchedule

    DateBuilder 类提供了多种方法以便于构造 DateTimeOffset 实例来指定特定时间点(例如,指定为下个小时的时间 - 换句话说,如果现在是9:43:27,指定的时间就是10:00:00)。

    Jobs and Triggers

    任务是一个实现了IJob接口的类,它只有一个简单的方法。

    IJob 接口

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

    当任务的触发器触发时,调度器的其中一个工作线程会调用Execute(..)方法。传递给这个方法的JobExecutionContext对象提供了包含它的“运行时(run-time)”环境信息的job实例,这些信息包括访问执行它的调度器的句柄,触发这个操作的触发器的句柄,任务的JobDetail对象,和一些其他信息。

    JobDetail对象是 Quartz.NET 客户(client)(你的程序)把任务加入到调度器时产生的。它包括了多种Job的属性,而且提供了JobDataMap,它可以为job类的实例存储状态信息。这就是job实例的本质,下一节中会更详细的介绍。

    触发器对象用来触发任务的执行。当你想调度一个任务时,应实例化一个触发器并“调整”它的属性以满足你希望的调度安排。触发器还可以拥有与其关联的JobDataMap对象,这对传递参数给任务是非常有用的。Quartz提供了几种不同类型的触发器,但应用最多的是SimpleTrigger(ISimpleTrigger接口)和CronTrigger(ICronTrigger接口)。

    如果你需要“一次性”操作(在指定时间只进行一次操作),或者在指定时间进行一次任务,并在延迟时间执行N次,那么用SimpleTrigger是非常方便的。如果你触发任务基于像日历一样的计划,例如“每周五,中午”或“每月10号10:15”,那么CronTrigger是非常有用的。

    为什么分开用任务和触发器?许多任务调度器里没有分开的任务和触发器的概念。其中一些简单定义一个“任务”为有简单任务标志符的一个执行时间(计划),其他的很像Quartz的任务和触发器综合到一起的概念。开发Quartz时,我们决定把计划和在计划中进行的工作分开是非常有意义的。这有很多好处(我们觉得)。

    例如,任务可以独立于触发器,创建并存储在任务计划中,并且多个触发器可以与同一个任务关联。另一个低耦合的好处是,可以配置那些关联的触发器已经过期,但仍然在调度器里的任务,这使得之后不用重新定义就可以再次调度它。这同样允许你修改或替换一个触发器,而不用重新定义与它关联的任务。

    Identities

    任务和触发器在注册到Quartz调度器时可以给定标识键。任务和触发器的键(JobKey and TriggerKey)使得它们可以分组,方便分类规划你的任务和触发器,例如“报告任务”和“维护任务”。在同一组内任务和触发器的名称(name)属性必须是唯一的。话句话说,任务和触发器的完整键(标识),即名称(name)和组(group)的组合是惟一的。

    你现在对任务和触发器是什么有了一个总体的认识,你可以在Lesson 3: Jobs & JobDetails详细介绍Lesson 4: Triggers详细介绍里学到更多。

  • 相关阅读:
    Java Web表达式注入
    Mysql:The Federated Storage Engine:联合(联盟)存储引擎:【远程连接】服务器引擎
    Mysql:16.11.1 Pluggable Storage Engine Architecture
    Mysql:Server Logs:mysqld服务器的各种日志
    Mysql:InnoDB Table Compression and InnoDB Page Compression:适用于InnoDB的:表压缩 & 页压缩
    Mysql:Redo Log
    kubectl相关指令
    使用alias简化kubectl输入
    使用Minikube运行一个本地单节点Kubernetes集群(阿里云)
    Javascript去掉base64中的回车换行
  • 原文地址:https://www.cnblogs.com/David-Huang/p/9282483.html
Copyright © 2020-2023  润新知