定时任务框架Quartz.Net

简介

Quartz.Net是一个从 Java 版的Quartz移植过来定时任务框架,可以实现异常灵活的定时任务。本例中使用的版本为2.6.1,可以在NuGet包管理器控制台通过Install-Package Quartz -Version 2.6.1命令安装。

Quartz.Net 中有三个概念:计划者(IScheduler)、工作(IJob)、触发器(Trigger)。给计划者一个工作(Job),让他在 Trigger触发器的触发条件下执行这个工作(Job)。

使用

首先创建一个测试的工作类TestJob并实现IJob接口,在Execute方法中写要定时执行的代码:

public class TestJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine($"执行{DateTime.Now}");
    }
}

开始创建定时任务:

IScheduler scheduler = new StdSchedulerFactory().GetScheduler();  // 创建定时任务调度实例
JobDetailImpl job = new JobDetailImpl("TestJob", typeof(TestJob));  // 创建任务实例

CronScheduleBuilder builder = CronScheduleBuilder.DailyAtHourAndMinute(16, 31);  // 每天的16::31执行

IMutableTrigger trigger = builder.Build();  // 通过builder创建trigger
trigger.Key = new TriggerKey("TestTrigger");

scheduler.ScheduleJob(job, trigger);  // 将给定的job添加到调度器中,并将给定的trigger与它关联起来
scheduler.Start();

CronScheduleBuilder其他定时模式

指定一周某几天的17:14执行:

CronScheduleBuilder builder = CronScheduleBuilder.
    AtHourAndMinuteOnGivenDaysOfWeek(18, 08, DayOfWeek.Tuesday, DayOfWeek.Friday);

Cron表达式设定,每天的17、18、19点的54分钟执行:

CronScheduleBuilder builder = CronScheduleBuilder.CronSchedule("0 54 17,18,19 * * ?");

Cron表达式可以参阅:http://www.cnblogs.com/junrong624/p/4239517.html

每个月的19日18:03执行:

CronScheduleBuilder builder = CronScheduleBuilder.MonthlyOnDayAndHourAndMinute(19, 18, 03);

每周二的22:21执行:

CronScheduleBuilder builder = CronScheduleBuilder.
    WeeklyOnDayAndHourAndMinute(DayOfWeek.Tuesday, 22, 21);

CalendarIntervalScheduleBuilder

WithInterval(int interval, IntervalUnit unit):设置触发器触发的时间间隔和时间单位;
WithIntervalInDays(int intervalInDays):设置触发器触发的天;
WithIntervalInHours(int intervalInHours):设置触发器触发的小时;
还有WithIntervalInYears、WithIntervalInMonths、WithIntervalInWeeksWithIntervalInMinutes、WithIntervalInSeconds等;

SimpleScheduleBuilder

用到在查,无需记录。

其他

因为Job任务是运行在单独的线程中,无法通过断点调试进入,发生异常同样不会抛出异常提醒,所以需要我们在Execute方法中进行try……catch……,通过记录错误日志等方法进行处理。
同样是因为Job任务运行在单独线程,所以无法通过HttpContext.Current.Server.MapPath("~/1.txt"); 拿到虚拟路径,因为已经不再当前上下文环境,这时我们可以通过HostingEnvironment类下的静态方法MapPath获取:HostingEnvironment.MapPath("~/ 1.txt");;

猜你喜欢

转载自blog.csdn.net/anndcorner/article/details/80737443