一、核心架构与组件
调度器(Scheduler)
负责管理作业和触发器的生命周期,支持线程池管理、作业状态监控和事件监听,可配置线程池大小以优化性能。- 功能示例:
csharpCopy Code
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start();
- 功能示例:
作业(Job)
通过实现IJob
接口定义任务逻辑,支持异步执行和依赖注入。- 定义示例:
csharpCopy Code
public class DataSyncJob : IJob { public async Task Execute(IJobExecutionContext context) { // 业务逻辑 } }
- 定义示例:
触发器(Trigger)
支持多种触发策略:- 简单触发(SimpleTrigger):固定间隔执行(如每10秒)。
- Cron触发(CronTrigger):基于表达式灵活调度(如
0 0 2 * * ?
表示每日凌晨2点)。
二、典型应用场景
定时数据处理
- 场景示例:每日凌晨统计前日数据,每月初生成报表。
- 代码配置:
csharpCopy Code
IJobDetail job = JobBuilder.Create<ReportJob>() .WithIdentity("monthly_report") .Build(); ITrigger trigger = TriggerBuilder.Create() .WithCronSchedule("0 0 1 1 * ?") // 每月1日执行 .Build();
任务依赖与链式调度
通过JobChainingJobListener
实现任务顺序执行。集群与高可用
结合数据库持久化(如 SQL Server、MySQL)实现任务状态共享和故障转移,支持多节点负载均衡7。
三、开发流程与配置
基础配置
- NuGet 安装:
bashCopy Code
Install-Package Quartz
- 调度器初始化:
csharpCopy Code
var props = new NameValueCollection { ["quartz.threadPool.MaxConcurrency"] = "10" }; ISchedulerFactory factory = new StdSchedulerFactory(props); IScheduler scheduler = await factory.GetScheduler();
- NuGet 安装:
持久化配置
- 数据库脚本:使用官方提供的 SQL 脚本初始化表结构(如
QRTZ_JOB_DETAILS
、QRTZ_TRIGGERS
)。 - 配置文件:
xmlCopy Code
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX" /> <add key="quartz.jobStore.dataSource" value="default" /> <add key="quartz.dataSource.default.connectionString" value="Server=.;Database=Quartz;Integrated Security=True;" />
- 数据库脚本:使用官方提供的 SQL 脚本初始化表结构(如
监听器与扩展
- 作业监听:通过
IJobListener
实现任务执行前后的日志记录或告警。 - 插件机制:自定义插件扩展调度器功能(如任务历史跟踪)。
- 作业监听:通过
四、性能优化与注意事项
线程池调优
根据任务并发量调整quartz.threadPool.ThreadCount
,避免资源竞争。避免长时间阻塞
使用异步作业(async/await
)释放线程资源,提升吞吐量。异常处理
在作业中捕获异常并通过日志或邮件通知,防止任务中断。
总结
- 适用场景:复杂定时任务、集群部署、高可用性需求。
- 优势:灵活触发策略、开源可扩展、社区支持完善。
- 推荐实践:优先使用 Cron 表达式定义复杂调度规则,结合数据库持久化保障任务可靠性。