Quartz.NET 作业调度(一):Test

Quartz.NET 是一个开源的作业调度框架,是 Java 作业调度框架 Quartz 的.NET 版本,对于周期性的任务,其作业和触发器的结合,极大的简化了代码的编写,大多时候我们只需要关注作业本身的逻辑。Quartz.NET 支持持久化、集群。Quartz.NET 3.0 已经开始支持 .NET Core/.NET Standard 2.0。

体系结构

体系结构

Job 为作业的接口,JobDetail 用来描述 Job 的实现类及其它相关的静态信息;Trigger 作为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个 Trigger ;Scheduler 做为定时任务容器,它包含了所有触发器和作业,每个 Scheduler 都存有 JobDetail 和 Trigger
的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger 。

安装

创建一个基于 .NET Core 2.0 控制台程序,Nuget 安装 Quartz 即可。

1
Install-Package Quartz

使用说明

主要接口和类说明:

IScheduler :和调度器交互的主要接口
JobBuilder:定义 JobDetail 实例
IJobDetail:定义 Job 实例及其它相关的静态信息
IJob:自定义的作业模块所要继承的接口,调度器会调用这个实现
TriggerBuilder:定义 Trigger 实例
ITrigger:定义 Job 被触发的时间

创建流程:
  1. 创建作业调度池 IScheduler
  2. 创建作业 IJobDetail
  3. 创建触发器 ITrigger
  4. 将作业和触发器加入到作业调度池中
  5. 开始运行
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static async Task RunScheduler()
{
// 创建作业调度池
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();

// 创建作业
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
.Build();

// 创建触发器,每10s执行一次
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.RepeatForever())
.Build();

// 加入到作业调度池中
await scheduler.ScheduleJob(job, trigger);

// 开始运行
await scheduler.Start();
}

作业实现类 HelloJob

1
2
3
4
5
6
7
8
9
10
11
12
public class HelloJob : IJob
{
/// <summary>
/// 作业调度定时执行的方法
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync("Hello QuartzNet...");
}
}

代码说明:

通过 StdSchedulerFactory 获取到调度工厂 ISchedulerFactory,通过调度工厂的 GetScheduler 方法获取到一个调度器 scheduler 。初始化调度器 scheduler 之后, 就可以启动、 备用、 关闭。

通过 JobBuilder 创建一个 IJobDetail 作业详情 ,指定一个 IJob 的实现类 HelloJob ,同时指定了作业详情标识的键名和组名。

通过 TriggerBuilder 创建一个 ITrigger 触发器,指定了这个触发器标识的键名和组名,触发器只有在启动状态才能工作,这里设置了 StartNow,同时设置了触发器的执行时间,每隔10s执行一次。当 Trigger 触发的时候, HelloJob 的Execute(..) 方法就会在调度器 scheduler 的工作线程中执行,
这里设置的 RepeatForever 是指在当前守护进程内重复执行,如果程序被关闭了,那必然不会继续执行。

执行结果:

执行结果

参考链接:

如果对你有帮助就好