Quartz.Net系列(十二):六大Calendar(Annual、Cron、Daily、Holiday、Monthly、Weekly)
Quartz.Net中为了动态排除一些时间,而使用Calendar可以做到
1.DailyCalendar
可以动态的排除一天中的某些时间段
示例:在一天当中的13:00到14:00不要执行
public async static Task Test() { var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(13,0,0).DateTime, DateBuilder.DateOf(14,0,0).DateTime); var job = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build(); var trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( d => d.OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 30)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00)) .WithIntervalInSeconds(1) ) .ModifiedByCalendar("myCalendar") .Build(); await scheduler.AddCalendar("myCalendar", dailyCalendar, true,true); await scheduler.ScheduleJob(job, trigger); }
public class MyJob : IJob { public async Task Execute(IJobExecutionContext context) { await Task.Factory.StartNew(() => { var nextTime = context.NextFireTimeUtc?.ToLocalTime(); var currentTime = DateTime.Now; var jobKey = context.JobDetail.Key; Console.WriteLine($"JobKey={jobKey}, CurrentTime={currentTime}, FireTime={context.ScheduledFireTimeUtc?.ToLocalTime()}, NextTime={nextTime}"); }); } }
2.WeeklyCalendar
可以动态的排除一周内的哪几天不执行
示例:设置每周的周六和周日不能被执行
public async static Task Test() { var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(13,0,0).DateTime, // DateBuilder.DateOf(14,0,0).DateTime); WeeklyCalendar calendar = new WeeklyCalendar(); calendar.SetDayExcluded(DayOfWeek.Sunday,true); calendar.SetDayExcluded(DayOfWeek.Saturday, true); var job = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build(); var trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( d => d.OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 30)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00)) .WithIntervalInSeconds(1) ) .ModifiedByCalendar("myCalendar") .Build(); await scheduler.AddCalendar("myCalendar", calendar, true,true); await scheduler.ScheduleJob(job, trigger); }
3.HolidayCalendar
动态的排除哪一天不执行
示例:设置今天不能被执行
public async static Task Test() { var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(13,0,0).DateTime, // DateBuilder.DateOf(14,0,0).DateTime); //WeeklyCalendar calendar = new WeeklyCalendar(); //calendar.SetDayExcluded(DayOfWeek.Sunday,true); //calendar.SetDayExcluded(DayOfWeek.Saturday, true); HolidayCalendar calendar = new HolidayCalendar(); calendar.AddExcludedDate(DateTime.Today); var job = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build(); var trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( d => d.OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 30)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00)) .WithIntervalInSeconds(1) ) //.ModifiedByCalendar("myCalendar") .Build(); await scheduler.AddCalendar("myCalendar", calendar, true,true); await scheduler.ScheduleJob(job, trigger); }
4.MonthlyCalendar
排除每个月中的某一天不能被执行
示例:设置每月的第12天不能被执行
public async static Task Test() { var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(13,0,0).DateTime, // DateBuilder.DateOf(14,0,0).DateTime); //WeeklyCalendar calendar = new WeeklyCalendar(); //calendar.SetDayExcluded(DayOfWeek.Sunday,true); //calendar.SetDayExcluded(DayOfWeek.Saturday, true); //HolidayCalendar calendar = new HolidayCalendar(); //calendar.AddExcludedDate(DateTime.Today); //calendar.RemoveExcludedDate(DateTime.Now); MonthlyCalendar calendar = new MonthlyCalendar(); calendar.SetDayExcluded(12, true); var job = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build(); var trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( d => d.OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 30)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00)) .WithIntervalInSeconds(1) ) .ModifiedByCalendar("myCalendar") .Build(); await scheduler.AddCalendar("myCalendar", calendar, true,true); await scheduler.ScheduleJob(job, trigger); }
5.AnnualCalendar
排除每一年中的某一天不被执行
示例:设置每年的7月12日不能被执行
public async static Task Test() { var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(13,0,0).DateTime, // DateBuilder.DateOf(14,0,0).DateTime); //WeeklyCalendar calendar = new WeeklyCalendar(); //calendar.SetDayExcluded(DayOfWeek.Sunday,true); //calendar.SetDayExcluded(DayOfWeek.Saturday, true); //HolidayCalendar calendar = new HolidayCalendar(); //calendar.AddExcludedDate(DateTime.Today); //calendar.RemoveExcludedDate(DateTime.Now); //MonthlyCalendar calendar = new MonthlyCalendar(); //calendar.SetDayExcluded(12, true); AnnualCalendar calendar = new AnnualCalendar(); calendar.SetDayExcluded(new DateTime(2020,7,12),true); var job = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build(); var trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( d => d.OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 30)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00)) .WithIntervalInSeconds(1) ) .ModifiedByCalendar("myCalendar") .Build(); await scheduler.AddCalendar("myCalendar", calendar, true,true); await scheduler.ScheduleJob(job, trigger); }
public virtual void SetDayExcluded(DateTime day, bool exclude) { DateTime d = new DateTime(FixedYear, day.Month, day.Day, 0, 0, 0); if (exclude) { if (!IsDateTimeExcluded(day, false)) { excludeDays.Add(d); } } else { // include if (IsDateTimeExcluded(day, false)) { excludeDays.Remove(d); } } }
6.CronCalendar
以 Cron表达式的方式排除哪些时间不能被执行
示例:设置每月的第12天不能被执行
public async static Task Test() { var scheduler = await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //DailyCalendar dailyCalendar = new DailyCalendar(DateBuilder.DateOf(13,0,0).DateTime, // DateBuilder.DateOf(14,0,0).DateTime); //WeeklyCalendar calendar = new WeeklyCalendar(); //calendar.SetDayExcluded(DayOfWeek.Sunday,true); //calendar.SetDayExcluded(DayOfWeek.Saturday, true); //HolidayCalendar calendar = new HolidayCalendar(); //calendar.AddExcludedDate(DateTime.Today); //calendar.RemoveExcludedDate(DateTime.Now); //MonthlyCalendar calendar = new MonthlyCalendar(); //calendar.SetDayExcluded(12, true); //AnnualCalendar calendar = new AnnualCalendar(); //calendar.SetDayExcluded(new DateTime(2020,7,12),true); CronCalendar calendar = new CronCalendar("* * * 12 * ?"); var job = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build(); var trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( d => d.OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 30)) .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(22, 00)) .WithIntervalInSeconds(1) ) .ModifiedByCalendar("myCalendar") .Build(); await scheduler.AddCalendar("myCalendar", calendar, true,true); await scheduler.ScheduleJob(job, trigger); }
微信:17873041739
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?