我們在日常開發中,總會遇到這樣的需求:每隔一段時間,執行一次某個任務。固定某個時間執行任務,例如凌晨12點對當天的數據進行統計。每個月的第幾天,執行某個任務。
Quartz.Net是根據Java的Quartz用C#改寫而來,Quartz.NET是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。Quartz.NET允許開發人員根據時間間隔來調度作業。
Quartz版本:3.3.2
1.NuGet中下載安裝Quartz
2.新建Quartz幫助類
(1)新建JobSchedule類
public class JobSchedule{public JobSchedule(Type jobType, string cronExpression){JobType = jobType;CronExpression = cronExpression;}public Type JobType { get; }public string CronExpression { get; }
新建QuartzFactory類
public class QuartzFactory : IJobFactory{private readonly IServiceProvider _serviceProvider;public QuartzFactory(IServiceProvider serviceProvider){_serviceProvider = serviceProvider;}public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler){return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;}public void ReturnJob(IJob job){ }
新建QuartzService類
public?class?QuartzHostedService?:?IHostedService{private readonly ISchedulerFactory _schedulerFactory;private readonly IJobFactory _jobFactory;private readonly IEnumerable<JobSchedule> _jobSchedules;public QuartzHostedService(ISchedulerFactory schedulerFactory,IJobFactory jobFactory,IEnumerable<JobSchedule> jobSchedules){_schedulerFactory = schedulerFactory;_jobSchedules = jobSchedules;_jobFactory = jobFactory;}public IScheduler Scheduler { get; set; }public async Task StartAsync(CancellationToken cancellationToken){Scheduler = await _schedulerFactory.GetScheduler(cancellationToken);Scheduler.JobFactory = _jobFactory;foreach (var jobSchedule in _jobSchedules){var job = CreateJob(jobSchedule);var trigger = CreateTrigger(jobSchedule);await Scheduler.ScheduleJob(job, trigger, cancellationToken);}await Scheduler.Start(cancellationToken);}public async Task StopAsync(CancellationToken cancellationToken){await Scheduler?.Shutdown(cancellationToken);}private static IJobDetail CreateJob(JobSchedule schedule){var jobType = schedule.JobType;return JobBuilder.Create(jobType).WithIdentity(jobType.FullName).WithDescription(jobType.Name).Build();}private static ITrigger CreateTrigger(JobSchedule schedule){return TriggerBuilder.Create().WithIdentity($"{schedule.JobType.FullName}.trigger").WithCronSchedule(schedule.CronExpression).WithDescription(schedule.CronExpression).Build();}}
在Startup.cs中注冊代碼
services.AddControllers();#region Quartz Service// Add Quartz servicesservices.AddSingleton<IJobFactory, QuartzFactory>();services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();// Add our jobservices.AddTransient<DeleteFileJob>();services.AddJob();services.AddHostedService<QuartzHostedService>();
Quartz.Net源碼:
https://github.com/quartznet/quartznet
官方學習文檔:
http://www.quartz-scheduler.net/documentation/index.html