.NET core Quartz 定時任務框架 demo


開始先建個空的web項目。

創建一個新類 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)
        {
        }
    }

QuartzJob

public class QuartzJob : IJob
    {
        Logger logger = LogManager.GetCurrentClassLogger();
        public async Task Execute(IJobExecutionContext context)
        {
            var jobKey = context.JobDetail.Key;//獲取job信息
            var triggerKey = context.Trigger.Key;//獲取trigger信息   --jobWork1  --jobWork2

            logger.Info($"{DateTime.Now} QuartzJob:==>>自動執行\r\n.{jobKey.Name}|{triggerKey.Name}\r\n");
            await Task.CompletedTask;
        }
    }

QuartzService

  public static class 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("jobWork1")
            .StartNow()
            .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
            .ForJob(job)
            .Build();
 
          var trigger2 = TriggerBuilder.Create()
            .WithIdentity("jobWork2")
            .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
    }
View Code

上面代碼中的一段代碼解讀

  var trigger2 = TriggerBuilder.Create()
      .WithIdentity("jobWork2")
      .StartNow()
      .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(11)).RepeatForever())
      .ForJob(job)
      .Build();


WithIdentity()
括號里面的字符串到時候會傳到QuartzJob類,
我是主要是用這個字符串來判斷你所定時執行的某個作業某個任務。

 

WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(11)).RepeatForever())

這里面的  TimeSpan.FromSeconds(11)  是你定時的時間。

也可以定時每天的幾點。CronScheduleBuilder.DailyAtHourAndMinute(16, 10)  

這就是定時每天的16點10分執行當然你復制完這些類沒用的。因為是core項目 還是要注冊任務的。

 


Startup類
public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();   //注冊mvc服務  
            services.AddQuartz(typeof(QuartzJob));
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //使用NLog作為日志記錄工具
            loggerFactory.AddNLog();
            //引入Nlog配置文件
            env.ConfigureNLog("Nlog.config");

            QuartzService.StartJobs<QuartzJob>();  //多任務

            //QuartzService.StartJob<QuartzJob>();  //單任務

            app.UseMvc(routes => {     //開啟mvc
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}"
                    );
            });
        }

這樣就可以運行了。

 

因為我寫的是demo  用的是日志Nlog。

 

 可以看到是jobWork1和2可以用來區分任務的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM