这段代码中,QuartzHostedService有三个依赖项:Startup.ConfigureServices()中注入的ISchedulerFactory和IJobFactory,以及一个IEnumerable。在第五节的代码中,我们只向DI添加了一个JobSchedule,就是DemoJob。我们也可以添加多个JobSchedule,他们都会在这个IEnumerable中被注入到托管服务中。
StartAsync在应用程序启动时被调用,它是我们配置Quartz的地方。我们首先创建IScheduler的一个实例,为它分配一个属性供以后使用,并将调度程序的JobFactory设置为注入的实例:
public async Task StartAsync(CancellationToken cancellationToken){
Scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
Scheduler.JobFactory = _jobFactory;
//...
}
然后,循环注入的作业调度,并在类的最后使用CreateJob和CreateTrigger方法为每个作业创建一个IJobDetail和ITrigger。实际应用中如果有别的需要,也可以通过扩展JobSchedule DTO来定制它。
最后,在调度了所有作业之后,调用Scheduler.Start()来实际在后台启动Quartz.NET调度器。当应用程序关闭时,框架将调用StopAsync(),此时可以调用Scheduler.Shutdown()来安全地关闭调度程序进程。
全部完成后,我们启动QuartzHostedService:
public void ConfigureServices(IServiceCollection services){
// ...
services.AddHostedService<QuartzHostedService>();
}
运行程序,可以看到结果:
demo.DemoJob: Information: Demo !info: demo.DemoJob[0]
Demo !
demo.DemoJob: Information: Demo !
info: demo.DemoJob[0]
Demo !
demo.DemoJob: Information: Demo !
info: demo.DemoJob[0]
Demo !
demo.DemoJob: Information: Demo !
info: demo.DemoJob[0]
Demo !
本文的代码,在https://github.com/humornif/Demo-Code/tree/master/0029/demo
微信公众号:老王Plus