.NET Core中Quartz 3.x版本如何将调度任务设为待机状态
解决.NET Core 3.1中Quartz 3.4无法获取正确Scheduler实例的问题
问题根源
- 直接调用
StdSchedulerFactory.GetDefaultScheduler()会创建全新的Scheduler实例,和AddQuartz/AddQuartzServer初始化的调度器不是同一个,所以执行暂停/待机操作不会生效。 - 手动注册
ISchedulerFactory和IScheduler单例的方式,覆盖了Quartz官方DI集成的默认注册,导致配置的任务、JobFactory等都没有被加载,任务自然无法运行。
正确解决方案
1. 保留原有Quartz配置
不要修改AddQuartz和AddQuartzServer的配置,这部分是正确的:
services.AddTransient<SomeJob>(); services.AddSingleton<ITypeLoadHelper, SimpleTypeLoadHelper>(); var jobKey = new JobKey("SomeJob"); services.AddQuartz(q => { q.SchedulerId = "JobScheduler"; q.SchedulerName = "Job Scheduler"; q.UseMicrosoftDependencyInjectionScopedJobFactory(); q.AddJob<SomeJob>(j => j.WithIdentity(jobKey)); q.AddTrigger(t => t .WithIdentity("someJobTrigger") .ForJob(jobKey) .StartNow() .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(14, 00)) ); }); services.AddQuartzServer(options => { options.WaitForJobsToComplete = true; });
2. 通过依赖注入获取Scheduler实例
在需要执行暂停/待机操作的类(比如控制器、业务服务)中,直接注入IScheduler,然后调用对应的方法:
public class JobManagementService { private readonly IScheduler _scheduler; // 构造函数注入IScheduler public JobManagementService(IScheduler scheduler) { _scheduler = scheduler; } public async Task PauseJobAndTrigger() { // 待机整个调度器 await _scheduler.Standby(); // 暂停指定触发器 await _scheduler.PauseTrigger(new TriggerKey("someJobTrigger")); } }
3. 注册业务服务(如果需要)
如果是自定义的业务服务,记得注册到DI容器:
services.AddScoped<JobManagementService>();
关键说明
- Quartz的
AddQuartz扩展已经自动将IScheduler和ISchedulerFactory注册为单例,无需手动创建。 - 只有通过DI获取的
IScheduler实例,才是QuartzServer正在运行的那个调度器,操作它才能生效。
内容的提问来源于stack exchange,提问作者Sanjeevi Subramani
相关产品推荐
相关产品推荐

