Quartz.Net多个日历

时间:2011-05-02 23:05:26

标签: c# quartz.net

使用Quartz.Net并且需要相同的触发器才能有多个日历,虽然这是不可能的,但我正在寻找如何实现类似功能的建议。

例如,我想在X分钟内完成工作,每天早上9点到10点排除,但可以根据需要在白天阻止其他时间。

下面的代码工作正常,但如果我想阻止另一个时间间隔,我看不到这样做的方法。

ISchedulerFactory schedFact = new StdSchedulerFactory();
sched = schedFact.GetScheduler();

CronCalendar cronCal = new CronCalendar("* * 9 ? * * *");
sched.AddCalendar("testCal", cronCal, true, true);

CronTrigger trigger = new CronTrigger("cronTrigger", null, "0 0/1 * 1/1 * ? *");               
trigger.StartTimeUtc = DateTime.UtcNow.AddMinutes(10);
trigger.CalendarName = "testCal";

JobDetail job = new JobDetail("testJob", null, typeof(DumbJob));

sched.ScheduleJob(job, trigger);
sched.start();

简单的测试工作:

public class DumbJob : IJob
        {
            public DumbJob()
            {
            }

            public void Execute(JobExecutionContext context)
            {
                MessageBox.Show("Dumb job is running");
            }
        }

2 个答案:

答案 0 :(得分:3)

您可以创建一系列日历。每个日历都可以有一个基本日历,在确定是否排除或包含给定时间时也会对其进行检查。请参阅CronCalendar的构造函数:

public CronCalendar(ICalendar baseCalendar, string expression)

答案 1 :(得分:0)

我设法找到实施多日历的解决方案并找到链接:Quartz.Net multple calendars Marko Lahma提供了使用BaseCaleandar创建日历链的解决方案。

我测试过并发现日历链中存在一些错误。

我只是更改Quartz.Examples.2010.Example8中的一些代码。

将WeeklyCalendar添加到AnnualCalendar:

WeeklyCalendar weeklyCalendar = new WeeklyCalendar();

weeklyCalendar.SetDayExcluded(DayOfWeek.Sunday, true);
weeklyCalendar.SetDayExcluded(DayOfWeek.Saturday, true);

// Add the holiday calendar to the schedule
AnnualCalendar holidays = new AnnualCalendar(weeklyCalendar);

接下来两天在AnuualCalendar中添加两个假期:

 DateTime day1= new DateTime(DateTime.UtcNow.Year, 1, 22);
 holidays.SetDayExcluded(day1, true);
 DateTime day2= new DateTime(DateTime.UtcNow.Year, 1, 23);
 holidays.SetDayExcluded(day2, true);

使用IntervalInHourse将AnnualCalendar附加到SimpleTrigger上72小时/ 96小时/ 120小时,并在1/21点火。

  1. 正确的结果是1/25为72h但返回1/24。
  2. 正确的结果是96秒的1/26,但返回1/24。
  3. 正确的结果是120的1/31,是的,它确实返回1/31。