如何在 Quartz.net 每天的同一时间开始工作

本文关键字:同一时间 开始 工作 每天 net Quartz | 更新日期: 2023-09-27 18:32:46

我必须在太平洋时间每天午夜执行作业。我正在使用带有 Quartz.NET 库的 MVC3。

这是我的代码:

public static void ConfigureQuartzJobs()
{
    ISchedulerFactory schedFact = new StdSchedulerFactory();
    IScheduler sched = schedFact.GetScheduler();
    DateTime dateInDestinationTimeZone = System.TimeZoneInfo
        .ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, System.TimeZoneInfo.Utc.Id, "Pacific Standard Time").Date;

    IJobDetail job = JobBuilder.Create<TimeJob>()
        .WithIdentity("job1", "group1")
        .Build();
    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity("trigger1", "group1")
        .StartAt(dateInDestinationTimeZone)
        .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever())
        .Build();
    sched.ScheduleJob(job, trigger);
    sched.Start();
}

代码使此作业仅在第一个午夜(太平洋时间)运行一次。我已经设置了.WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever())但它不起作用 - 工作不是每天都重复。

我能做些什么来让它每天都在工作?

如何在 Quartz.net 每天的同一时间开始工作

您的计划任务是否由 Web 应用程序托管?如果是这样,您可能会遇到此类问题。Web 应用程序不适合运行计划任务。您应该创建托管计划任务的 Windows 服务。

但您也可以检查一些事项:

  1. 尝试使用较短的时间段(即,如果您将间隔设置为 1 分钟,请检查这是否有效)。
  2. 尝试CronTrigger - 我在Windows服务中使用它,它工作正常。

有一些文章解释了在 Web 应用程序中托管计划任务的优缺点,即这个:http://www.foliotek.com/devblog/running-a-scheduled-task/。

这个问题

在7年前就已经问过了,并且已经得到了接受的答复。但我认为在 7 年中有一些变化,所以我会通过 CronScheduleBuilder 建议这个解决方案。

        //Constructing job trigger.
        ITrigger trigger = TriggerBuilder.Create()
                          .WithIdentity("Test")
                          .WithSchedule(CronScheduleBuilder
                          .DailyAtHourAndMinute(16,40))
                      .WithSimpleSchedule(x=>x.WithIntervalInMinutes(number)
                          .WithRepeatCount(number) 
                          .Build();

在本例中,此代码每天在特定时间 16:40 触发作业。使用间隔次数和重复计数与次数