.net core中Quartz的使用方法
原來工作中有用到定時任務(wù)Quartz,不過是在MVC項目中,現(xiàn)在net core項目中也要用到,就開始改版。中間發(fā)現(xiàn)在網(wǎng)上的教程只有執(zhí)行定時計劃的過程,卻很少有人寫注冊的過程,覺得有點略坑。所以寫此文章一是自己做個記錄,二是希望能幫助到其他人。后面還把此功能做出了多任務(wù)定時執(zhí)行,網(wǎng)上關(guān)于net core的教程更是少了,花費了不少時間實現(xiàn)了出來。
Quartz版本:3.0.7
1.NuGet中下載安裝Quartz
2.新建Quartz幫助類
(1)新建QuartzJob類,代碼如下:
public class QuartzJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
var jobKey = context.JobDetail.Key;//獲取job信息
var triggerKey = context.Trigger.Key;//獲取trigger信息
LogHelper.Info($"{DateTime.Now} QuartzJob:==>>自動執(zhí)行.{jobKey.Name}|{triggerKey.Name}");
await Task.CompletedTask;
}
}
ps: 上面代碼中的jobKey和triggerKey可獲取到自己定義的job和trigger的信息,這樣做多任務(wù)時可區(qū)分要執(zhí)行的是哪個任務(wù). 另LogHelper.Info是自己封裝好的日子記錄類,可替換為自己的日志類
(2)新建QuartzFactory類,代碼如下:
public class QuartzFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public QuartzFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
var jobDetail = bundle.JobDetail;
var job = (IJob)_serviceProvider.GetService(jobDetail.JobType);
return job;
}
public void ReturnJob(IJob job)
{
}
}
(3)新建QuartzService類,代碼如下:
#region 單任務(wù)
public static void StartJob<TJob>() where TJob : IJob
{
var scheduler = new StdSchedulerFactory().GetScheduler().Result;
var job = JobBuilder.Create<TJob>()
.WithIdentity("job")
.Build();
var trigger1 = TriggerBuilder.Create()
.WithIdentity("job.trigger")
.StartNow()
.WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
.ForJob(job)
.Build();
scheduler.AddJob(job, true);
scheduler.ScheduleJob(job, trigger1);
scheduler.Start();
}
#endregion
#region 多任務(wù)
public static void StartJobs<TJob>() where TJob : IJob
{
var scheduler = new StdSchedulerFactory().GetScheduler().Result;
var job = JobBuilder.Create<TJob>()
.WithIdentity("jobs")
.Build();
var trigger1 = TriggerBuilder.Create()
.WithIdentity("job.trigger1")
.StartNow()
.WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
.ForJob(job)
.Build();
var trigger2 = TriggerBuilder.Create()
.WithIdentity("job.trigger2")
.StartNow()
.WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(11)).RepeatForever())
.ForJob(job)
.Build();
var dictionary = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>
{
{job, new HashSet<ITrigger> {trigger1, trigger2}}
};
scheduler.ScheduleJobs(dictionary, true);
scheduler.Start();
}
#endregion
#region 配置
public static void AddQuartz(this IServiceCollection services, params Type[] jobs)
{
services.AddSingleton<IJobFactory, QuartzFactory>();
services.Add(jobs.Select(jobType => new ServiceDescriptor(jobType, jobType, ServiceLifetime.Singleton)));
services.AddSingleton(provider =>
{
var schedulerFactory = new StdSchedulerFactory();
var scheduler = schedulerFactory.GetScheduler().Result;
scheduler.JobFactory = provider.GetService<IJobFactory>();
scheduler.Start();
return scheduler;
});
}
#endregion
3.在Startup.cs中注冊代碼
public void ConfigureServices(IServiceCollection services)
{
services.AddQuartz(typeof(QuartzJob));
//........
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
QuartzService.StartJobs<QuartzJob>();
//........
}
ps: 因AddQuartz方法定義的是Type[]類型,所以可傳多個執(zhí)行類,如:services.AddQuartz(typeof(QuartzJob1), typeof(QuartzJob2)); 不過這樣做StartJob()方法就得另處理下,這里就略過
OK,大功告成,這個東西折騰了兩天終于塵埃落定了,執(zhí)行結(jié)果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET Core中使用xUnit進(jìn)行單元測試
這篇文章主要介紹了ASP.NET Core中使用xUnit進(jìn)行單元測試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
asp.net core MVC之實現(xiàn)基于token的認(rèn)證
這篇文章主要介紹了asp.net core MVC之實現(xiàn)基于token的認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Asp.Net程序目錄下文件夾或文件操作導(dǎo)致Session失效的解決方案
這篇文章主要介紹了Asp.Net程序目錄下文件夾或文件操作導(dǎo)致Session失效的解決方案,需要的朋友可以參考下2017-06-06
詳解VS2017 Linux 上.NET Core調(diào)試
這篇文章主要介紹了詳解VS2017 Linux 上.NET Core調(diào)試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
ASP.NET數(shù)據(jù)綁定之DataList控件
這篇文章主要為大家介紹了ASP.NET數(shù)據(jù)綁定中的DataList控件,DataList控件以表的形式呈現(xiàn)數(shù)據(jù),通過該控件,您可以使用不同的布局來顯示數(shù)據(jù)記錄,對DataList控件感興趣的小伙伴們可以參考一下2016-01-01
asp.net使用npoi讀取excel模板并導(dǎo)出下載詳解
這篇文章主要介紹了asp.net使用npoi讀取excel模板并導(dǎo)出下載的示例,大家參考使用吧2014-01-01

