视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.net core中Quartz的使用方法
2020-11-27 22:34:38 责编:小采
文档


原来工作中有用到定时任务Quartz,不过是在MVC项目中,现在net core项目中也要用到,就开始改版。中间发现在网上的教程只有执行定时计划的过程,却很少有人写注册的过程,觉得有点略坑。所以写此文章一是自己做个记录,二是希望能帮助到其他人。后面还把此功能做出了多任务定时执行,网上关于net core的教程更是少了,花费了不少时间实现了出来。

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:==>>自动执行.{jobKey.Name}|{triggerKey.Name}");
 await Task.CompletedTask;
 }
 }

ps: 上面代码中的jobKey和triggerKey可获取到自己定义的job和trigger的信息,这样做多任务时可区分要执行的是哪个任务. 另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[]类型,所以可传多个执行类,如:services.AddQuartz(typeof(QuartzJob1), typeof(QuartzJob2)); 不过这样做StartJob()方法就得另处理下,这里就略过

OK,大功告成,这个东西折腾了两天终于尘埃落定了,执行结果如下:

下载本文
显示全文
专题