Quartz.NET 2.x 快速入门指南:从安装到第一个定时任务

Quartz.NET 2.x 快速入门指南:从安装到第一个定时任务

quartznet Quartz Enterprise Scheduler .NET quartznet 项目地址: https://gitcode.com/gh_mirrors/qu/quartznet

前言

Quartz.NET 是一个功能强大且灵活的开源作业调度框架,专为 .NET 平台设计。它允许开发者创建简单或复杂的定时任务调度,适用于从简单的后台任务到复杂的分布式系统作业调度等各种场景。本文将带你快速了解 Quartz.NET 的核心概念,并指导你完成第一个 Quartz.NET 应用程序的创建。

环境准备

安装方式选择

Quartz.NET 提供两种主要安装方式:

  1. ZIP 压缩包安装

    • 适合需要源代码、示例和完整文档的开发者
    • 包含 Quartz.NET 服务器示例应用程序
    • 需要手动添加程序集引用
  2. NuGet 包安装

    • 最快捷的安装方式
    • 只包含运行 Quartz.NET 所需的二进制文件
    • 自动处理依赖关系

通过 NuGet 安装(推荐)

对于大多数开发者,我们推荐使用 NuGet 包管理器进行安装:

  1. 在 Visual Studio 中右键点击项目引用
  2. 选择"管理 NuGet 程序包"
  3. 搜索"Quartz"
  4. 选择 Quartz.NET 并安装

或者使用 NuGet 命令行工具:

Install-Package Quartz

手动安装注意事项

如果选择 ZIP 压缩包安装,需要注意:

  • 核心依赖只有两个:Quartz.dll 和 Common.Logging.dll
  • Common.Logging 是一个日志抽象层,允许你使用自己喜欢的日志框架
  • 确保将这两个 DLL 添加到项目引用中

基础配置

Quartz.NET 提供了灵活的配置方式,支持三种配置来源(可组合使用):

  1. 通过代码提供 NameValueCollection 参数
  2. 使用标准的 app.config/web.config 文件
  3. 使用独立的 quartz.config 文件

最小配置示例

创建一个 quartz.config 文件,内容如下:

quartz.scheduler.instanceName = MyScheduler
quartz.threadPool.threadCount = 3
quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz

关键配置说明:

  • instanceName:调度器实例名称
  • threadCount:线程池大小,决定同时运行作业的最大数量
  • jobStore.type:作业存储方式,RAMJobStore 表示内存存储(不持久化)

重要提示:在 Visual Studio 中,确保将 quartz.config 文件的"复制到输出目录"属性设置为"始终复制"。

创建第一个 Quartz.NET 应用

基础框架代码

让我们从一个最简单的调度器示例开始:

using System;
using System.Threading;
using Quartz;
using Quartz.Impl;

namespace QuartzSampleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 从工厂获取调度器实例
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
                
                // 启动调度器
                scheduler.Start();
                
                // 等待一段时间
                Thread.Sleep(TimeSpan.FromSeconds(60));
                
                // 关闭调度器
                scheduler.Shutdown();
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }
    }
}

注意:调度器启动后会保持运行状态(使用非后台线程),直到显式调用 Shutdown() 方法。

添加日志输出

为了更好理解调度器的工作状态,我们可以添加控制台日志:

Common.Logging.LogManager.Adapter = 
    new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter 
    { 
        Level = Common.Logging.LogLevel.Info
    };

添加日志后,启动程序将显示详细的调度器初始化信息。

创建并调度第一个作业

定义作业类

作业是 Quartz.NET 中的核心概念,每个作业必须实现 IJob 接口:

public class HelloJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Greetings from HelloJob!");
    }
}

创建作业和触发器

在调度器启动后,添加以下代码来创建并调度作业:

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

// 创建触发器:立即启动,每10秒重复一次
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .RepeatForever())
    .Build();

// 将作业与触发器关联
scheduler.ScheduleJob(job, trigger);

完整示例代码

using System;
using System.Threading;
using Quartz;
using Quartz.Impl;

namespace QuartzSampleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 配置日志
                Common.Logging.LogManager.Adapter = 
                    new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter 
                    { 
                        Level = Common.Logging.LogLevel.Info
                    };

                // 获取调度器实例
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();

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

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

                // 调度作业
                scheduler.ScheduleJob(job, trigger);

                // 等待60秒
                Thread.Sleep(TimeSpan.FromSeconds(60));

                // 关闭调度器
                scheduler.Shutdown();
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }
    }

    public class HelloJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("Greetings from HelloJob!");
        }
    }
}

运行结果

运行程序后,你将看到:

  1. 详细的调度器初始化日志
  2. 每10秒输出一次"Greetings from HelloJob!"
  3. 60秒后程序自动关闭

下一步建议

现在你已经完成了第一个 Quartz.NET 应用程序,接下来可以探索:

  • 更复杂的触发器配置(如 Cron 表达式)
  • 作业数据传递(JobDataMap)
  • 持久化作业存储(如数据库存储)
  • 监听器和插件机制
  • 集群部署和故障转移

Quartz.NET 提供了丰富的功能来满足各种复杂的调度需求,这个快速入门只是帮助你迈出了第一步。

quartznet Quartz Enterprise Scheduler .NET quartznet 项目地址: https://gitcode.com/gh_mirrors/qu/quartznet

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡唯隽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值