技术
Quartz.NET 安装
田敏
2024-11-042 分钟阅读CodingTipsC#
Quartz.NET 是一个强大的 .NET 定时任务框架,可以用来执行各种定时任务,比如每隔一定时间执行某项任务,或在特定的时间点触发事件。它支持持久化任务调度、分布式执行、并发控制等功能。下面是 Quartz.NET 的基本使用介绍:
Quartz.NET 安装
首先需要在项目中安装 Quartz 包:
dotnet add package Quartz
Quartz 核心概念
在使用 Quartz.NET 时,有几个核心概念:
- Job:任务,代表实际要执行的代码逻辑。
- Trigger:触发器,用于定义任务执行的时间计划。
- Scheduler:任务调度器,控制任务的调度和执行。
- JobStore:任务存储,用于持久化任务的状态。
基本使用
1. 定义 Job
Quartz 的 Job 需要实现 IJob 接口,该接口只有一个方法 Execute,其中包含要执行的任务逻辑。例如:
using Quartz;
using System;
using System.Threading.Tasks;
public class MyJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"Job executed at {DateTime.Now}");
return Task.CompletedTask;
}
}
2. 配置 Scheduler 和 Trigger
接下来,需要创建任务调度器 Scheduler,然后为 MyJob 配置一个触发器 Trigger,以定义任务的执行时间。例如,每隔5秒执行一次。
using Quartz;
using Quartz.Impl;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
// 创建 Scheduler 工厂
StdSchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
// 启动 Scheduler
await scheduler.Start();
// 定义 Job
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("myJob", "group1")
.Build();
// 定义 Trigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5) // 每5秒执行一次
.RepeatForever())
.Build();
// 将 Job 和 Trigger 加入 Scheduler
await scheduler.ScheduleJob(job, trigger);
// 保持程序运行,等待任务执行
await Task.Delay(TimeSpan.FromMinutes(1));
// 关闭 Scheduler
await scheduler.Shutdown();
}
}
Cron 表达式
Quartz 还支持使用 Cron 表达式来定义任务的触发时间,这样可以更灵活地设置执行时间。例如:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("cronTrigger", "group1")
.WithCronSchedule("0/10 * * * * ?") // 每10秒执行一次
.Build();
Cron 表达式格式如下:
秒 分 时 天 月 星期 年(可选)
例子:
"0 0 12 * * ?":每天中午12点执行"0 15 10 ? * *":每天上午10:15执行"0 0/5 14 * * ?":每天下午2点到2:55之间每5分钟执行
Quartz.NET 的持久化
默认情况下,Quartz 的调度信息保存在内存中,但如果需要持久化任务状态,可以使用 Quartz 的持久化功能。
1. 配置数据库
可以使用 SQL Server 作为 Quartz 的数据库。创建 Quartz 表结构(Quartz 提供了建表脚本)。
2. 使用持久化调度器
配置 SchedulerFactory 使用数据库持久化:
var properties = new NameValueCollection
{
{ "quartz.scheduler.instanceName", "QuartzScheduler" },
{ "quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" },
{ "quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" },
{ "quartz.jobStore.tablePrefix", "QRTZ_" },
{ "quartz.jobStore.dataSource", "default" },
{ "quartz.dataSource.default.connectionString", "Server=localhost;Database=QuartzDB;User Id=sa;Password=your_password;" },
{ "quartz.dataSource.default.provider", "SqlServer" }
};
var schedulerFactory = new StdSchedulerFactory(properties);
var scheduler = await schedulerFactory.GetScheduler();
通过数据库持久化,Quartz 可以在程序重启后恢复任务状态。
任务的暂停、恢复和删除
Quartz 提供了对任务的控制操作,例如暂停、恢复和删除任务:
// 暂停任务
await scheduler.PauseJob(new JobKey("myJob", "group1"));
// 恢复任务
await scheduler.ResumeJob(new JobKey("myJob", "group1"));
// 删除任务
await scheduler.DeleteJob(new JobKey("myJob", "group1"));
并发控制
对于同一任务的并发执行,可以通过实现 IJob 接口的 DisallowConcurrentExecution 属性来控制:
[DisallowConcurrentExecution]
public class MyJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
// 任务逻辑
}
}
以上属性确保同一任务不会并发执行。
版权协议:MIT返回列表