如何使用 Quartz.Net 开始计划作业?

Posted

技术标签:

【中文标题】如何使用 Quartz.Net 开始计划作业?【英文标题】:How to start a scheduled job using Quartz.Net? 【发布时间】:2022-01-07 01:05:41 【问题描述】:

我创建了一个 .Net 5 worker 服务应用程序并安装了 Quartz.AspNetCore 包。

我想运行基于 cron 表达式的代码,例如每 5 分钟一次。我创建了一个类 MyJob 实现 Ijob 并在 DI 设置期间注册它

    public static void Main(string[] args)
    
        Host
            .CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            
                services
                    .AddQuartz(quartzConfiguration =>
                    
                        quartzConfiguration.ScheduleJob<MyJob>(jobConfiguration =>
                        
                            jobConfiguration.WithCronSchedule("20/20 0 0 ? * * *"); // Every 20 seconds starting at second 20
                        );
                    )
                    .AddQuartzHostedService(quartzConfiguration => // I think this code is useful ?
                    
                        quartzConfiguration.WaitForJobsToComplete = true;
                    )
                    .AddHostedService<Worker>();
            )
            .Build()
            .Run();
    

但作业本身永远不会执行。调用 quartzConfiguration.AddJob&lt;MyJob&gt;() 时,我无法访问方法 .WithCronSchedule()

那么如何告诉 Quartz 注册一个作业并根据 cron 表达式执行它?

【问题讨论】:

澄清一下,这应该在凌晨 12 点运行?没有任何例外或什么? IJob 代码永远不会被命中? @RowanFreeman 你介意解释一下“12am”的时间吗?我从这里freeformatter.com/cron-expression-generator-quartz.html 获取了 cron 表达式并得到了相同的 cron 字符串 我只是想确保 OP 实际上一直等到凌晨 12 点才能运行作业。看起来小时部分为零,等于凌晨 12 点(00:00:20 和 00:00:40)。 @RowanFreeman 所以你认为20/20 0 0 ? * * * 不会在 20 秒后启动,然后每 20 秒执行一次?也许生成器页面对我来说并不明显...... @RowanFreeman 好吧,看来 cron 表达式是错误的,我用 0 */2 * ? * *(每 2 分钟)进行了测试,结果有效...... 【参考方案1】:

cron 表达式20/20 0 0 ? * * * 的意思是“每 20 秒,在前 20 秒之后,在第一个小时的第一分钟。

所以基本上,00:00:2000:00:40,即午夜过后 20 秒和午夜过后 40 秒。

检查这是否是您想要的 cron。其他一切看起来都正确。

【讨论】:

以上是关于如何使用 Quartz.Net 开始计划作业?的主要内容,如果未能解决你的问题,请参考以下文章

Quartz.Net

Quartz使用

Quartz.Net 如何创建每天不增加 1 分钟的日程安排

Quartz.NET 与 Windows 计划任务。他们有啥不同?

1 Quartz开始

Quartz.net开源作业调度框架使用详解