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

.NET6项目中如何让Quartz读取appsettings.json配置

问题原因

你手动实例化了StdSchedulerFactory,这个方式不会读取你通过services.Configure<QuartzOptions>配置的参数,而是使用Quartz的默认配置,所以才会默认使用RAMJobStore,也不会加载QuartzJobs.xml里的任务。

修复方案

调整代码,利用.NET DI集成Quartz的能力,不要手动创建调度器工厂:

1. 修正服务注册代码

把服务注册部分改成这样,让AddQuartz直接读取配置并绑定自定义JobFactory:

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: false)
    .AddJsonFile($"appsettings.{environment}.json", optional: true)
    .AddEnvironmentVariables()
    .Build();

var services = new ServiceCollection();

// 直接通过AddQuartz读取配置,同时绑定自定义JobFactory
services.AddQuartz(options =>
{
    // 绑定appsettings中的Quartz配置节点
    configuration.GetSection("Quartz").Bind(options);
    // 注册自定义JobFactory
    options.UseJobFactory<JobFactory>();
});

// 添加Quartz宿主服务,自动管理调度器的启动与停止
services.AddQuartzHostedService(options =>
{
    options.WaitForJobsToComplete = true;
});

// 注册自定义JobFactory实例
services.AddSingleton<JobFactory>();

var serviceProvider = services.BuildServiceProvider();

// 从DI容器获取调度器实例,而非手动创建
_scheduler = serviceProvider.GetRequiredService<IScheduler>();
// 无需手动调用Start,AddQuartzHostedService会自动处理启动逻辑
// _scheduler.Start().Wait();

2. 优化appsettings.json配置结构(可选)

QuartzOptions支持不带quartz.前缀的嵌套配置,你可以简化配置文件结构,让可读性更好:

{
  "Quartz": {
    "plugin": {
      "xml": {
        "type": "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz",
        "fileNames": "~/QuartzJobs.xml"
      }
    },
    "dataSource": {
      "quartzDataSource": {
        "connectionString": "--valid connection string--",
        "provider": "SqlServer-20"
      }
    },
    "jobStore": {
      "type": "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
      "driverDelegateType": "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz",
      "dataSource": "quartzDataSource",
      "tablePrefix": "quartz.QRTZ_",
      "clustered": true
    },
    "scheduler": {
      "instanceId": "AUTO"
    }
  }
}

这种嵌套结构更符合.NET配置的常规风格,configuration.GetSection("Quartz").Bind(options)能正确解析所有配置项。

3. 确认QuartzJobs.xml的路径有效性

确保~/QuartzJobs.xml的路径正确,可将该文件的复制属性设置为如果较新则复制,保证程序运行时能读取到该文件。

关键注意点
  • 禁止手动创建StdSchedulerFactory,它无法感知.NET DI容器中的配置与服务,必须通过DI获取IScheduler实例。
  • AddQuartzHostedService会自动处理调度器的启动、停止逻辑,无需手动调用Start()和Shutdown()。
  • 自定义JobFactory通过options.UseJobFactory<JobFactory>()注册后,无需再手动设置_scheduler.JobFactory。

内容的提问来源于stack exchange,提问作者Black Light

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:52:09