一、實體及文件結構
public class JobSchedule
{public string Id { get; set; }public string Title { get; set; }public string Cron { get; set; }
}
二、服務類
后臺服務類初始化時會調用此類的StartAsync方法
public class QuartzService : IQuartzService
{private readonly IScheduler _scheduler;public QuartzService(IJobFactory jobFactory) // 接收 IJobFactory{var schedulerFactory = new StdSchedulerFactory();_scheduler = schedulerFactory.GetScheduler().Result;// 設置自定義 JobFactory_scheduler.JobFactory = jobFactory;}public async Task StartAsync(){await _scheduler.Start();//模擬通過查庫獲得任務列表(實際可以通過注入IFreeSql等方式獲取)List<JobSchedule> list = new List<JobSchedule>{new JobSchedule{Id = Guid.NewGuid().ToString(),Title = "每間隔3s打印一次時間",Cron = "0/3 * * * * ?"},new JobSchedule{Id = Guid.NewGuid().ToString(),Title = "每間隔15s打印一次時間",Cron = "0/15 * * * * ?"}};foreach (var jobSchedule in list){var job = JobBuilder.Create<PrintTimeJob>() // 使用泛型方式//.Create(Type.GetType("WebApplication1.Controllers.Quartz.PrintTimeJob")) //使用命名空間+類名方式.WithIdentity(jobSchedule.Id).UsingJobData("title", jobSchedule.Title)//傳遞參數到邏輯方法PrintTimeJob中.Build();var trigger = TriggerBuilder.Create().WithIdentity($"{jobSchedule.Id}.trigger").WithCronSchedule(jobSchedule.Cron).StartNow().Build();await _scheduler.ScheduleJob(job, trigger);}}public async Task StopAsync(){await _scheduler.Shutdown();}
}
三、后臺服務類
初始化的關鍵在配置(Startup.cs)中
public class QuartzHostedService : IHostedService
{private readonly IQuartzService _quartzService;public QuartzHostedService(IQuartzService quartzService){_quartzService = quartzService;}public async Task StartAsync(CancellationToken cancellationToken){await _quartzService.StartAsync();}public async Task StopAsync(CancellationToken cancellationToken){await _quartzService.StopAsync();}
}
四、任務邏輯方法
實現IJob,會根據Cron表達式定時執行該方法(服務類已注冊)
下面的注入IFreesql只是一個示例,表達的意思是可以查庫
/// <summary>
/// 邏輯方法
/// </summary>
public class PrintTimeJob : IJob
{private readonly IFreeSql _freeSql;public PrintTimeJob(IFreeSql freeSql){_freeSql = freeSql;}public async Task Execute(IJobExecutionContext context){var q = await _freeSql.Ado.QueryAsync<string>("select id from city");var title = context.JobDetail.JobDataMap.GetString("title");Console.WriteLine($"{title}: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");await Task.CompletedTask;}
}
五、Startup.cs配置
public void ConfigureServices(IServiceCollection services)
{//省略其他不相關代碼// 注冊Quartz相關服務services.AddQuartz();//Quartz框架添加到依賴注入容器services.AddSingleton<IQuartzService, QuartzService>();//自己編寫的服務類services.AddHostedService<QuartzHostedService>();//自己編寫的后臺服務類,初始化時會調用上面這個服務類
}