.net core中Quartz的使用方法
原來(lái)工作中有用到定時(shí)任務(wù)Quartz,不過(guò)是在MVC項(xiàng)目中,現(xiàn)在net core項(xiàng)目中也要用到,就開(kāi)始改版。中間發(fā)現(xiàn)在網(wǎng)上的教程只有執(zhí)行定時(shí)計(jì)劃的過(guò)程,卻很少有人寫注冊(cè)的過(guò)程,覺(jué)得有點(diǎn)略坑。所以寫此文章一是自己做個(gè)記錄,二是希望能幫助到其他人。后面還把此功能做出了多任務(wù)定時(shí)執(zhí)行,網(wǎng)上關(guān)于net core的教程更是少了,花費(fèi)了不少時(shí)間實(shí)現(xiàn)了出來(lái)。
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:==>>自動(dòng)執(zhí)行.{jobKey.Name}|{triggerKey.Name}"); await Task.CompletedTask; } }
ps: 上面代碼中的jobKey和triggerKey可獲取到自己定義的job和trigger的信息,這樣做多任務(wù)時(shí)可區(qū)分要執(zhí)行的是哪個(gè)任務(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中注冊(cè)代碼
public void ConfigureServices(IServiceCollection services) { services.AddQuartz(typeof(QuartzJob)); //........ } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { QuartzService.StartJobs<QuartzJob>(); //........ }
ps: 因AddQuartz方法定義的是Type[]類型,所以可傳多個(gè)執(zhí)行類,如:services.AddQuartz(typeof(QuartzJob1), typeof(QuartzJob2)); 不過(guò)這樣做StartJob()方法就得另處理下,這里就略過(guò)
OK,大功告成,這個(gè)東西折騰了兩天終于塵埃落定了,執(zhí)行結(jié)果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET Core中使用xUnit進(jìn)行單元測(cè)試
這篇文章主要介紹了ASP.NET Core中使用xUnit進(jìn)行單元測(cè)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11asp.net core MVC之實(shí)現(xiàn)基于token的認(rèn)證
這篇文章主要介紹了asp.net core MVC之實(shí)現(xiàn)基于token的認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Asp.Net程序目錄下文件夾或文件操作導(dǎo)致Session失效的解決方案
這篇文章主要介紹了Asp.Net程序目錄下文件夾或文件操作導(dǎo)致Session失效的解決方案,需要的朋友可以參考下2017-06-06詳解VS2017 Linux 上.NET Core調(diào)試
這篇文章主要介紹了詳解VS2017 Linux 上.NET Core調(diào)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04ASP.NET數(shù)據(jù)綁定之DataList控件
這篇文章主要為大家介紹了ASP.NET數(shù)據(jù)綁定中的DataList控件,DataList控件以表的形式呈現(xiàn)數(shù)據(jù),通過(guò)該控件,您可以使用不同的布局來(lái)顯示數(shù)據(jù)記錄,對(duì)DataList控件感興趣的小伙伴們可以參考一下2016-01-01為密碼文本框要求不可粘帖字符串只可手動(dòng)輸入(附演示動(dòng)畫)
以前開(kāi)發(fā)程序時(shí),用戶登錄的密碼文本框,是可以粘帖密碼字符串的,為了安全起見(jiàn)用戶要求不要粘帖,只能由手動(dòng)輸入,感興趣的朋友可以了解下2013-01-01asp.net使用npoi讀取excel模板并導(dǎo)出下載詳解
這篇文章主要介紹了asp.net使用npoi讀取excel模板并導(dǎo)出下載的示例,大家參考使用吧2014-01-01