石英.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");
}
}
您可以创建日历链。每个日历都可以有一个基本日历,在确定是否排除或包含给定时间时也会检查基本日历。参见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小时内触发。
- 正确的结果是72小时的1/25,但返回1/24。
- 正确的结果是1/26的96h,但返回1/24。
- 正确的结果是120的1/31,是的,它确实返回1/31。