使用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");
}
}
答案 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点火。