以前项目中的定时任务是自己手动写的,今天写了个小东,需要用到定时任务。就想着看看有没有开源的,一搜还真多。选了一个推荐多的——Quartz。Quartz不仅可以单机部署,还可以配置集群。今天就先体验了一下,配置还是真简单。
第一步:引入Quartz.AspNetCore
在创建的.net5项目的依赖项中,添加Nuget包,这里要找到Quartz.AspNetCore的包进行安装
第二步:创建调度任务
创建一个实现类,继承IJob接口,在接口的Execute的实现方法中写入我们的任务函数即可。这里和在.net framework中的区别就是Execute的函数返回的是一个Task。
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Lkb.Utils.Quartz
{
public class JobPickInfo: IJob
{
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
Console.WriteLine("这是一个任务");
});
}
}
}
第三步:创建任务调度类
using MedicalPlatform.DAL.Log4Net;
using MedicalPlatform.DAL.Znyg;
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lkb.Utils.Quartz
{
public class QuartzStartUp
{
//调度工厂
private ISchedulerFactory _factory;
//调度器
private IScheduler _scheduler;
/// <summary>
///
/// </summary>
/// <returns></returns>
public async Task<string> Start()
{
//1、声明一个调度工厂
_factory = new StdSchedulerFactory();
//2、通过调度工厂获得调度器
_scheduler = await _factory.GetScheduler();
//3、开启调度器
await _scheduler.Start();
//4、创建任务
IJobDetail jobpickinfo = JobBuilder.Create<JobPickInfo>().Build();
//5、创建一个触发器 2分钟执行一次
ITrigger triggerpickinfo = TriggerBuilder.Create()
.WithIdentity("JobPickInfo", "PickInfo")
.WithSimpleSchedule(x => x.WithIntervalInMinutes(2).RepeatForever()).Build();
//6、将触发器和任务器绑定到调度器中
await _scheduler.ScheduleJob(jobpickinfo, triggerpickinfo);
return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
}
public void Stop()
{
if(_scheduler != null)
{
_scheduler.Clear();
_scheduler.Shutdown();
}
_scheduler = null;
_factory = null;
}
}
}
创建了QuartzStartUp的任务调度类,在Start()方法中加入了创建任务,触发器及绑定。
第四步:注册Quartz
Quartz的注册需要在startup的类中进行实现:
- 在ConfigureServices中注入调度类
#region 注入 Quartz调度类
services.AddSingleton<QuartzStartUp>();
//注册ISchedulerFactory的实例。
services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
#endregion
- 在Configure中启动Quartz
#region Quartz任务调度
//获取前面注入的Quartz调度类
var quartz = app.ApplicationServices.GetRequiredService<QuartzStartUp>();
appLifetime.ApplicationStarted.Register(() =>
{
quartz.Start().Wait();
});
appLifetime.ApplicationStopped.Register(() =>
{
quartz.Stop();
});
#endregion
这样Quartz在.net5下就可以正常使用了。
;