.net core中Quartz的使用方法

 更新时间2019年03月09日 10:57:01   作者影响   我要评论

这篇文章主要介绍了.net core中Quartz的使用方法小编觉得挺不错的现在分享给大家也给大家做个参考一起跟随小编过来看看吧

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

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大功告成这个东西折腾了?#25945;?#32456;于尘埃落定了执行结果如下

以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持脚本之家

您可能?#34892;?#36259;的文章:

相关文章

  • ASP.NET(AJAX+JSON)实现对象调用

    ASP.NET(AJAX+JSON)实现对象调用

    最近开始学习ASP.NET AJAX 搞了?#25945;?#23398;了点皮毛,贴点代码 日后方便自己查看.
    2010-01-01
  • .NET/C#如何使用反射注册事件详解

    .NET/C#如何使用反射注册事件详解

    反射是.NET中的重要机制下面这篇文章主要给大家介绍了关于.NET/C#如何使用反射注册事件的相关资?#24076;?#25991;中通过示例代码介绍的非常详细需要的朋友可以参考借鉴下面随着小编来一起学习学习吧
    2018-09-09
  • .NET Core 2.0 Preview2 发布汇总

    .NET Core 2.0 Preview2 发布汇总

    这篇文章主要为大家详细介绍了.NET Core 2.0 Preview2 发布汇总的相关内容具有一定的参?#25216;?#20540;?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
    2017-06-06
  • 最新评论

    常用在线小工具

    35ѡ7