.net core中Quartz的使用方法
原來工作中有用到定時任務Quartz,不過是在MVC項目中,現(xiàn)在net core項目中也要用到,就開始改版。中間發(fā)現(xiàn)在網(wǎng)上的教程只有執(zhí)行定時計劃的過程,卻很少有人寫注冊的過程,覺得有點略坑。所以寫此文章一是自己做個記錄,二是希望能幫助到其他人。后面還把此功能做出了多任務定時執(zhí)行,網(wǎng)上關于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的信息,這樣做多任務時可區(qū)分要執(zhí)行的是哪個任務. 另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 單任務
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 多任務
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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
.NET程序性能監(jiān)控系統(tǒng)Elastic?AMP的使用方法
這篇文章介紹了.NET程序性能監(jiān)控系統(tǒng)Elastic?AMP的使用方法,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-11-11
asp.net TreeView遞歸循環(huán)子節(jié)點生成樹形菜單實例
這篇文章主要介紹了asp.net TreeView遞歸循環(huán)子節(jié)點生成樹形菜單的方法,涉及asp.net遞歸算法及節(jié)點操作相關技巧,需要的朋友可以參考下2016-07-07
ASP.NET?Core?EFCore?屬性配置與DbContext的用法詳解
實體屬性配置是定義模型與數(shù)據(jù)庫映射的核心,EFCore 提供兩種方式:數(shù)據(jù)注解和?Fluent API,本文將深入探討ASP.NET Core中EFCore的實體屬性配置方法及DbContext的核心用法,感興趣的朋友一起看看吧2025-05-05
asp.net mvc 從數(shù)據(jù)庫中讀取圖片的實現(xiàn)代碼
今天搞了一天的MVC,在顯示圖片的時候老是出現(xiàn)問題,從網(wǎng)上搜索了好久,才找到解決方法。2010-05-05

