触发器的日历可以让你在某段日期内屏蔽执行作业
完整代码:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//注册调度器工厂
services.AddSingleton<ISchedulerFactory>(new StdSchedulerFactory());
}
HomeController.cs
using Microsoft.AspNetCore.Mvc;
using Quartz;
using Quartz.Impl.Calendar;
using System;
using System.Threading.Tasks;
namespace QuartzLearn.Controllers
{
public class HomeController : Controller
{
//调度器工厂
private readonly ISchedulerFactory _schedulerFactory;
//构造函数注入
public HomeController(ISchedulerFactory schedulerFactory)
{
//注入调度器工厂
_schedulerFactory = schedulerFactory;
}
public async Task<IActionResult> Index()
{
IScheduler scheduler = await _schedulerFactory.GetScheduler();
await scheduler.Start();
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "jobGroup1")
.UsingJobData("name", "zhangsan")
.Build();
//日历实例
HolidayCalendar cal = new HolidayCalendar();
//屏蔽的日期
cal.AddExcludedDate(DateTime.Parse("2020-11-12"));
await scheduler.AddCalendar("myHolidays", cal, false,false);
//在每天的9:30分触发一次
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30))
.ModifiedByCalendar("myHolidays") //不在myHolidays 日期触发
.Build();
await scheduler.ScheduleJob(job, trigger);
return View();
}
}
[DisallowConcurrentExecution]
[PersistJobDataAfterExecution]
public class HelloJob : IJob
{
public string Name { private get; set; }
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync($"This is HelloJob {DateTime.Now}");
}
}
}