You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:18:19