.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
相关产品推荐
相关产品推荐

