C# Quartz.Net多日历

C# Quartz.Net多日历,c#,quartz.net,C#,Quartz.net,使用Quartz.Net并且需要相同的触发器来拥有多个日历,虽然这是不可能的,但我正在寻找如何实现类似功能的建议 例如,我希望在X分钟内运行作业,并排除每天上午9-10点,但能够根据需要排除白天的其他时间 下面的代码运行良好,但如果我想屏蔽另一个时间间隔,我看不到一种方法 ISchedulerFactory schedFact = new StdSchedulerFactory(); sched = schedFact.GetScheduler(); CronCalendar cronCal

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

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

public CronCalendar(ICalendar baseCalendar, string expression)

我设法找到了实现多日历的解决方案,并找到了以下链接: Marko Lahma给出了使用BaseCaleandar创建日历链的解决方案

我测试了一下,发现日历链中有一些bug

我只是在
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);
在未来两天的UALCalendar中添加两个假期:

 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);
将年度校准仪连接到SimpleTrigger上,间隔72小时/96小时/120小时,并在1/21时点火

  • 72小时的正确结果为1/25,但返回1/24
  • 正确的结果是96h的1/26,但返回1/24
  • 正确的结果是120的1/31,是的,它返回1/31

  • 我在API文档中读过这个,但是我没有想到它可以这样使用。谢谢你的提示……当然还有优秀的软件;)