组成

任务(Job)

  • Job就是执行的作业,Job需要继承IJob接口,实现Execute方法。Job中执行的参数从Execute方法的参数中获取

触发器(Trigger)

SimpleTrigger触发器

CronTrigger触发器

Quartz.net - 图1 Quartz.net - 图2

调度器(Schedule)

  • 调度器就是将任务和触发器绑定,让触发器触发的时候去执行任务

使用

在Startup文件中注入ISchedulerFactory的实例

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddControllersWithViews();
  4. services.AddMvc();
  5. ////注册ISchedulerFactory的实例。
  6. services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
  7. }

使用注入的服务

  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.Extensions.Logging;
  3. using Quartz;
  4. using QuartzDemo.Models;
  5. using System.Threading.Tasks;
  6. namespace QuartzDemo.Controllers
  7. {
  8. public class HomeController : Controller
  9. {private readonly ISchedulerFactory _schedulerFactory;
  10. private IScheduler _scheduler;
  11. public HomeController(ISchedulerFactory schedulerFactory)
  12. {
  13. this._schedulerFactory = schedulerFactory;
  14. }
  15. public async Task<IActionResult> Index()
  16. {
  17. //通过调度工厂获得调度器
  18. _scheduler = await _schedulerFactory.GetScheduler();
  19. //开启调度器
  20. await _scheduler.Start();
  21. //创建一个触发器
  22. var trigger = TriggerBuilder.Create()
  23. .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
  24. .Build();
  25. //创建任务
  26. var jobDetail = JobBuilder.Create<MyJob>()
  27. .WithIdentity("job", "group")
  28. .Build();
  29. //将触发器和任务器绑定到调度器中
  30. await _scheduler.ScheduleJob(jobDetail, trigger);
  31. return View();
  32. }
  33. }
  34. }
  1. using Quartz;
  2. using System;
  3. using System.IO;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace QuartzDemo.Models
  7. {
  8. /// <summary>
  9. /// 创建IJob的实现类,并实现Excute方法
  10. /// </summary>
  11. public class MyJob : IJob
  12. {
  13. public Task Execute(IJobExecutionContext context)
  14. {
  15. return Task.Run(() =>
  16. {
  17. using (StreamWriter sw = new StreamWriter(@"C:\Users\lenovo\Desktop\1.txt", true, Encoding.UTF8))
  18. {
  19. sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));
  20. }
  21. });
  22. }
  23. }
  24. }

总结

通过演示可以看出,要执行一个定时任务,一般需要四步:

创建任务调度器。

  • 调度器通常在应用程序启动时创建,一个应用程序实例通常只需要一个调度器即可。

    创建Job和JobDetail

  • Job是作业的类型,描述了作业是如何执行的,这个类是由我们定义的;JobDetail是Quartz对作业的封装,它包含Job类型,以及Job在执行时用到的数据,还包括是否要持久化、是否覆盖已存在的作业等选项。

    创建触发器

  • 触发器描述了在何时执行作业。

    添加调度

  • 当完成以上三步以后,就可以对作业进行调度了