快速掌握Quartz.Net計(jì)劃任務(wù)調(diào)度框架,輕松實(shí)現(xiàn)定時(shí)任務(wù)
Quartz.Net架構(gòu)設(shè)計(jì)
Quartz.Net的架構(gòu)設(shè)計(jì)采用了經(jīng)典的MVC(Model-View-Controller)模式,其中:
- Model:表示應(yīng)用程序中的數(shù)據(jù)和狀態(tài)。在Quartz.Net中,Model由Job和Trigger組成,并由Scheduler調(diào)度。
- View:表示與用戶交互的部分。在Quartz.Net中,View由Scheduler框架提供的API和UI組件組成。
- Controller:負(fù)責(zé)處理用戶輸入并更新Model和View。在Quartz.Net中,Controller由Scheduler控制器組成。
- Quartz.Net組件模塊
Quartz.Net包含以下組件模塊:
- Scheduler:負(fù)責(zé)作業(yè)的調(diào)度和執(zhí)行。Scheduler維護(hù)一個(gè)作業(yè)和觸發(fā)器的調(diào)度列表,并根據(jù)定義的條件選擇要調(diào)度的作業(yè)。
- Job:表示要執(zhí)行的作業(yè)。在Quartz.Net中,Job必須實(shí)現(xiàn)IJob接口。
- Trigger:定義何時(shí)執(zhí)行作業(yè)。在Quartz.Net中,有多種類型的觸發(fā)器可供選擇,例如簡單觸發(fā)器、Cron觸發(fā)器等。
- JobDetail:表示作業(yè)的詳細(xì)信息,包括執(zhí)行作業(yè)所需的Job類及其名稱、描述和其他數(shù)據(jù)。
- JobExecutionContext:在作業(yè)執(zhí)行期間提供與應(yīng)用程序和Quartz.Net框架交互所需的上下文信息。
- SchedulerFactory:用于創(chuàng)建Scheduler的工廠類。
在NetCore項(xiàng)目中集成Quartz.Net,可以通過以下步驟實(shí)現(xiàn):
安裝Quartz.Net NuGet包
在Visual Studio的NuGet包管理器中搜索安裝Quartz.Net包,或通過命令行安裝:dotnet add package Quartz。
創(chuàng)建作業(yè)類
依據(jù)項(xiàng)目需求創(chuàng)建對應(yīng)的作業(yè)類,并實(shí)現(xiàn)IJob接口,例如:
public class MyJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync("Hello, Quartz.Net!");
}
}
配置Scheduler
在Startup.cs文件中添加配置代碼,創(chuàng)建Scheduler,添加作業(yè)和觸發(fā)器:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IJobFactory, SingletonJobFactory>();
services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
services.AddSingleton(new JobSchedule(
jobType: typeof(MyJob),
cronExpression: "0/5 * * * * ?")); // 每5秒執(zhí)行一次
services.AddHostedService<QuartzHostedService>();
}
public class JobSchedule
{
public Type JobType { get; }
public string CronExpression { get; }
public JobSchedule(Type jobType, string cronExpression)
{
JobType = jobType;
CronExpression = cronExpression;
}
}
public class SingletonJobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public SingletonJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)_serviceProvider.GetService(bundle.JobDetail.JobType);
}
public void ReturnJob(IJob job)
{
// do nothing
}
}
public class QuartzHostedService : IHostedService
{
private readonly ISchedulerFactory _schedulerFactory;
private readonly IJobFactory _jobFactory;
private readonly IEnumerable<JobSchedule> _jobSchedules;
public QuartzHostedService(
ISchedulerFactory schedulerFactory,
IJobFactory jobFactory,
IEnumerable<JobSchedule> jobSchedules)
{
_schedulerFactory = schedulerFactory;
_jobFactory = jobFactory;
_jobSchedules = jobSchedules;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
var scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
scheduler.JobFactory = _jobFactory;
foreach (var jobSchedule in _jobSchedules)
{
var jobDetail = JobBuilder.Create(jobSchedule.JobType).Build();
var trigger = TriggerBuilder.Create()
.WithCronSchedule(jobSchedule.CronExpression)
.Build();
await scheduler.ScheduleJob(jobDetail, trigger, cancellationToken);
}
await scheduler.Start(cancellationToken);
}
public async Task StopAsync(CancellationToken cancellationToken)
{
var scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
await scheduler.Shutdown(cancellationToken);
}
}
啟動(dòng)和停止Scheduler
在Main函數(shù)中啟動(dòng)調(diào)度程序:
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
await host.RunAsync();
}
官方網(wǎng)站:https://www.quartz-scheduler.net/。
官方文檔:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html。