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