工作中我们经常碰到定时或者固定时间点去做一些事情,然后每天到时间点就会去做这样的事情,如果理解这样的场景,我们就要引入今天我们的主角Quartz,其实这个跟数据库的作业类似,但是不仅仅局限于数据库。
一: quartZ引入&三大核心对象简介
1:在项目中打开Nuget管理,然后搜索QuartZ,现在最新的版本是3.0.7,需要在Framework4.5.2上面使用。
2:quartZ的三大核心对象
A:IScheduler:单元/实例,在这里去完成定时任务的配置,只有单元启动,里面的作业才能正常运行
B:IJob:任务,定时执行动作就是Job
C:ITrigger:定时策略(设置执行的频率或者执行方式)
二:三大核心对象的初始化以及使用如下:
#region schedulerConsole.WriteLine("初始化scheduler......");
StdSchedulerFactory factory= newStdSchedulerFactory();
IScheduler scheduler= awaitfactory.GetScheduler();//scheduler.ListenerManager.AddSchedulerListener(new CustomSchedulerListener());//scheduler.ListenerManager.AddTriggerListener(new CustomTriggerListener());//scheduler.ListenerManager.AddJobListener(new CustomJobListener());
awaitscheduler.Start();#endregion
//IJob ITrigger
{//创建作业
IJobDetail jobDetail = JobBuilder.Create()
.WithIdentity("testjob", "group1")
.WithDescription("This is TestJob")
.Build();//IJobDetail jobDetail = JobBuilder.Create()//.WithIdentity("testjob", "group1")//.WithDescription("This is TestJob")//.Build();
jobDetail.JobDataMap.Add("student1", "Milor");
jobDetail.JobDataMap.Add("student2", "心如迷醉");
jobDetail.JobDataMap.Add("student3", "宇洋");
jobDetail.JobDataMap.Add("Year", DateTime.Now.Year);//ITrigger trigger = TriggerBuilder.Create()//.WithIdentity("trigger1", "group1")//.StartNow()//.WithSimpleSchedule(x => x//.WithIntervalInSeconds(10)//.WithRepeatCount(10)//.RepeatForever())//.WithDescription("This is testjob's Trigger")//.Build();//创建时间策略
ITrigger trigger =TriggerBuilder.Create()
.WithIdentity("testtrigger1", "group1")
.StartAt(new DateTimeOffset(DateTime.Now.AddSeconds(10)))//.StartNow()//StartAt
.WithCronSchedule("5/10 * * * * ?")//每隔一分钟//"10,20,30,40,50,0 * * * * ?"
.WithDescription("This is testjob's Trigger")
.Build();
trigger.JobDataMap.Add("student4", "Ray");
trigger.JobDataMap.Add("student5", "心欲无痕");
trigger.JobDataMap.Add("student6", "风在飘动");
trigger.JobDataMap.Add("Year", DateTime.Now.Year + 1);awaitscheduler.ScheduleJob(jobDetail, trigger);
Console.WriteLine("scheduler作业添加完成......");
}
[PersistJobDataAfterExecution] //执行后可以保留执行结果
[DisallowConcurrentExecution] // 让一个任务执行完毕以后 才去执行下一个任务
public classTestJob : IJob
{publicTestJob()
{
Console.WriteLine("This is TestJob的构造。。。");
}public asyncTask Execute(IJobExecutionContext context)
{await Task.Run(() =>{
Console.WriteLine();
Console.WriteLine("*****************************");
{
JobDataMap dataMap=context.JobDetail.JobDataMap;
Console.WriteLine(dataMap.Get("student1"));
Console.WriteLine(dataMap.Get("student2"));
Console.WriteLine(dataMap.Get("student3"));
Console.WriteLine(dataMap.GetInt("Year"));
}
Console.WriteLine(