石英.Net多个日历

本文关键字:日历 Net 石英 | 更新日期: 2023-09-27 17:54:11

使用石英。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");
            }
        }

石英.Net多个日历

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

public CronCalendar(ICalendar baseCalendar, string expression)

我找到了实现多日历的解决方案,并找到了链接:Quartz。Net多个日历Marko Lahma给出了使用BaseCaleandar创建日历链的解决方案。

我测试了一下,发现日历链有一些错误。

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

添加周日历到年日历:

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);

为接下来的两天在anualcalendar中添加两个假期:

 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的SimpleTrigger,为72小时/96小时/120小时,并在1/21小时内触发。

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