Quartz 使用调度器前的准备
在能够使用调度器之前,需要先对其进行实例化(这想必不难猜到)。要做到这一点,你需要使用 ISchedulerFactory
接口的一个实现。
一旦调度器被实例化后,就可以启动它、使其进入待机模式或关闭它。请注意,一旦调度器被关闭,如果不重新实例化就无法重启。触发器(以及关联的作业)在调度器启动之前不会触发执行,同样,在调度器处于暂停状态时也不会。
下面是一段快速示例代码,展示了如何实例化并启动一个调度器,并安排一个作业执行:
安装 Quartz.NET NuGet 包
Install-Package Microsoft.Extensions.Hosting
Install-Package Quartz
Install-Package Quartz.Extensions.DependencyInjection
Install-Package Quartz.Extensions.Hosting
配置 Program.cs
使用 Microsoft Hosting 框架配置 Quartz.NET 的一个极简风格示例如下。
using Microsoft.Extensions.Hosting;
using Quartz;
var builder = Host.CreateDefaultBuilder()
.ConfigureServices((cxt, services) =>
{
services.AddQuartz();
services.AddQuartzHostedService(opt =>
{
opt.WaitForJobsToComplete = true;
});
}).Build();
// will block until the last running job completes
await builder.RunAsync();
我们给这个例子添加一个作业。
using Microsoft.Extensions.Hosting;
using Quartz;
var builder = Host.CreateDefaultBuilder()
.ConfigureServices((cxt, services) =>
{
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
});
services.AddQuartzHostedService(opt =>
{
opt.WaitForJobsToComplete = true;
});
}).Build();
var schedulerFactory = builder.Services.GetRequiredService<ISchedulerFactory>();
var scheduler = await schedulerFactory.GetScheduler();
// define the job and tie it to our HelloJob class
var job = JobBuilder.Create<HelloJob>()
.WithIdentity("myJob", "group1")
.Build();
// Trigger the job to run now, and then every 40 seconds
var trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(40)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job, trigger);
// will block until the last running job completes
await builder.RunAsync();
如你所见,使用 Quartz.NET 是相当简单的。在 第 2 课中,我们将快速概述作业和触发器,以便你能更全面地理解这个示例。
传统 Program.cs
结构
如果你正在一个非极简 API 项目中工作,也可以使用传统的 Program.cs
结构。
using Microsoft.Extensions.Hosting;
using Quartz;
namespace Example;
public class Program
{
public static async Task Main(string[] args) {
var builder = Host.CreateDefaultBuilder()
.ConfigureServices((cxt, services) =>
{
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
});
services.AddQuartzHostedService(opt =>
{
opt.WaitForJobsToComplete = true;
});
}).Build();
// will block until the last running job completes
await builder.RunAsync();
}
}