Quartz.Net CronTrigger调度无法按预期工作

时间:2014-03-20 13:47:36

标签: cron quartz-scheduler quartz.net cronexpression crontrigger

public static void ConfigureJob()
{
    int ScheduleTriggerDate = Convert.ToInt32(ConfigurationManager.AppSettings["ScheduleTriggerDate"]);

    ISchedulerFactory sf = new StdSchedulerFactory();
    IScheduler sched = sf.GetScheduler();


    IJobDetail job = JobBuilder.Create<MailingList>().WithIdentity("job1", "group1").Build();

    ITrigger trigger = TriggerBuilder.Create()
        .WithDailyTimeIntervalSchedule
        (s =>
            s.WithIntervalInHours(24)
                .OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(23, 0))
        )
        .Build();

    sched.ScheduleJob(job, trigger);
    sched.Start();
}

我正在尝试在Windows服务中安排Quartz.Net CronTrigger。我有上面的示例代码,我想要实现的是安排作业在特定时间每天运行。在测试中,我发现上面的代码不可靠,有时它运行,有时它只是无声地失败,

我在这里读了一些帖子,建议在上面的示例中使用CronTrigger而不是简单的触发器。

有没有人知道如何使用CronTrigger实现我的上述要求?或者我如何改进上面的示例,使其可以在app.config文件中设置的特定时间每天可靠地运行?

1 个答案:

答案 0 :(得分:1)

使用CronScheduleBuilder可以轻松配置CronTrigger

// Extension method to round a date to a given part
var nextFire = DateTime.Now.Truncate(TimeSpan.FromHours(1));
var trigger = TriggerBuilder.Create()
           .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(nextFire.Hour, nextFire.Minute).WithMisfireHandlingInstructionFireAndProceed())
           .Build();

如果您希望直接指定cron表达式(就像您在app.config文件中提到的那样):

// Runs every day at 9am in this example.
.WithSchedule(CronScheduleBuilder.CronSchedule("0 0 9 1/1 * ? *"))

您可以使用this site to calculate cron expressions