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

如何在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:45:04