一、实体及文件结构
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>();//自己编写的后台服务类,初始化时会调用上面这个服务类
}