田敏
返回博客列表
技术

Quartz.NET 安装

田敏
2024-11-042 分钟阅读
CodingTipsC#

Quartz.NET 是一个强大的 .NET 定时任务框架,可以用来执行各种定时任务,比如每隔一定时间执行某项任务,或在特定的时间点触发事件。它支持持久化任务调度、分布式执行、并发控制等功能。下面是 Quartz.NET 的基本使用介绍:

Quartz.NET 安装

首先需要在项目中安装 Quartz 包:

dotnet add package Quartz

Quartz 核心概念

在使用 Quartz.NET 时,有几个核心概念:

  1. Job:任务,代表实际要执行的代码逻辑。
  2. Trigger:触发器,用于定义任务执行的时间计划。
  3. Scheduler:任务调度器,控制任务的调度和执行。
  4. 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返回列表