如何在.NET5 Worker服务中使用Quartz.Net配置Cron定时任务?
Quartz.NET 在.NET 5 Worker Service 中 Cron 任务不执行的解决方案
核心故障原因
- 你当前使用的Cron表达式
"20/20 0 0 ? * * *"逻辑错误:该表达式仅在每日0点0分的第20秒、40秒触发,其余时间不会执行,这是任务不运行的最主要原因。 - Quartz的Cron表达式默认采用7位格式:
秒 分 时 日 月 周 年(可选),如果要实现每5分钟执行一次,正确表达式为"0 */5 * * * ?";如果要实现从第20秒开始每20秒执行的测试逻辑,正确表达式为"20/20 * * * * ?"。
AddJob<MyJob>()无法调用WithCronSchedule()的原因
AddJob方法仅负责注册任务实例本身,不关联触发器,所以没有调度配置相关方法。如果你需要单独注册Job再绑定触发器,需要先调用AddJob配置Job属性,再单独调用AddTrigger方法绑定Cron规则。ScheduleJob<T>()是简化方法,会同时完成Job注册+触发器绑定的两步操作,适合单触发器的简单任务场景。
配置注意事项
AddQuartzHostedService的配置是必要的,它会托管Quartz调度器的生命周期,随Worker Service启动/停止,WaitForJobsToComplete = true的配置是合理的,会在服务停止时等待正在运行的任务完成再退出。- 确保
MyJob类是公共可访问的,且Execute方法内没有吞掉异常(如果任务执行报错没有日志的话会看起来像没触发),建议在Execute方法中添加日志输出验证触发情况。
完整正确配置示例
public static void Main(string[] args) { Host .CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { // 注册Job,支持构造函数依赖注入 services.AddTransient<MyJob>(); services .AddQuartz(quartzConfiguration => { // 方案1:直接用ScheduleJob简化配置(适合单触发器任务) quartzConfiguration.ScheduleJob<MyJob>(jobTriggerConfiguration => { // 测试用:每20秒触发一次 jobTriggerConfiguration.WithCronSchedule("20/20 * * * * ?"); // 生产用:每5分钟触发一次 // jobTriggerConfiguration.WithCronSchedule("0 */5 * * * ?"); }); // 方案2:分开注册Job和触发器(适合多触发器的复杂任务,对应你尝试的写法) /* quartzConfiguration.AddJob<MyJob>(jobConfig => { jobConfig.WithIdentity("MyJob"); jobConfig.StoreDurably(); // 多触发器场景必须加该配置 }); quartzConfiguration.AddTrigger(triggerConfig => { triggerConfig.ForJob("MyJob") .WithCronSchedule("0 */5 * * * ?"); }); */ }) .AddQuartzHostedService(quartzConfiguration => { quartzConfiguration.WaitForJobsToComplete = true; }); // 若无自定义Worker业务逻辑,可删除AddHostedService<Worker>注册,Quartz本身的托管服务即可运行调度器 }) .Build() .Run(); }
MyJob参考实现
public class MyJob : IJob { private readonly ILogger<MyJob> _logger; public MyJob(ILogger<MyJob> logger) { _logger = logger; } public async Task Execute(IJobExecutionContext context) { _logger.LogInformation("MyJob 执行时间:{Time}", DateTime.Now); // 此处编写业务逻辑 await Task.CompletedTask; } }
内容的提问来源于stack exchange,提问作者Question3r
相关产品推荐
相关产品推荐

