.net core中Quartz的使用方法

 更新時間:2019-04-17 21:42:56   作者:佚名   我要評論(0)

原來工作中有用到定時任務Quartz,不過是在MVC項目中,現在net core項目中也要用到,就開始改版。中間發現在網上的教程只有執行定時計劃的過程,卻很少有人寫

原來工作中有用到定時任務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,大功告成,這個東西折騰了兩天終于塵埃落定了,執行結果如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • .Net Core中使用Quartz.Net實踐記錄

相關文章

  • .net core中Quartz的使用方法

    .net core中Quartz的使用方法

    原來工作中有用到定時任務Quartz,不過是在MVC項目中,現在net core項目中也要用到,就開始改版。中間發現在網上的教程只有執行定時計劃的過程,卻很少有人寫
    2019-04-17
  • PHP DB 數據庫連接類定義與用法示例

    PHP DB 數據庫連接類定義與用法示例

    本文實例講述了PHP DB 數據庫連接類定義與用法。分享給大家供大家參考,具體如下: 聲明: 近期觀看了一節 PHP 消息隊列視頻,對于講師WiconWang提供的代碼,
    2019-04-17
  • php生成word并下載代碼實例

    php生成word并下載代碼實例

    本文實例講述了php如何生成word并下載的具體實例。分享給大家供大家參考,具體如下: 1.前端代碼 <!DOCTYPE html> <html> <head> <title>PHP生成Word文檔<
    2019-04-17
  • PHP的簡單跳轉提示的實現詳解

    PHP的簡單跳轉提示的實現詳解

    在PHP開發中,尤其是MVC框架或者項目中,會碰到很多跳轉情況,比如:登錄成功或失敗后的跳轉等等。 以下以MVC框架開發中為基礎,示例講解: 在基礎控制器類中
    2019-04-17
  • JS正則表達式 整合 (值得收藏)

    JS正則表達式 整合 (值得收藏)

    url的正則表達式:包括IP,域名(domain),ftp,二級域名,域名中的文件,域名加上端口!用戶名等等信息 function IsURL(str_url) { var strRegex = "^
    2019-04-17
  • 正則表達式之匹配數字范圍

    正則表達式之匹配數字范圍

    最近有個需求就是根據產品編號批量下架產品,需要下架日期為16-31號之間的產品, 比如編號為B201607280023匹配表達式如下: ^201607(1[6-9]|2[0-9]|3[0-1]).+
    2019-04-17
  • PHP添加PNG圖片背景透明水印操作類定義與用法示例

    PHP添加PNG圖片背景透明水印操作類定義與用法示例

    本文實例講述了PHP添加PNG圖片背景透明水印操作類定義與用法。分享給大家供大家參考,具體如下: 圖片相關操作類 class ImageTool { private $imagePath;
    2019-04-17
  • 記Asp.Net Core Swagger使用并帶域接口處理的方法

    記Asp.Net Core Swagger使用并帶域接口處理的方法

    引用作者原話:Asp.Net的WebApi中使用Swagger作為說明和測試的頁面是非常不錯的,比起WebApiTestClient來至少在界面上的很大的提升。但是使用Swagger時如果只
    2019-04-17
  • 正則表達式匹配路由的實現代碼

    正則表達式匹配路由的實現代碼

    在 web 開發中,可能會出現限制用戶訪問規則的場景,那么這個時候就需要用到正則匹配,根據自己的規則去限定請求參數再進行訪問 具體實現步驟為: 導入轉換
    2019-04-17
  • PHP PDO數據庫操作預處理與注意事項

    PHP PDO數據庫操作預處理與注意事項

    PDO(PHP Database Object)擴展為PHP訪問數據庫定義了一個輕量級的、一致性的接口,它提供了一個數據訪問抽象層,這樣,無論使用什么數據庫,都可以通過一致
    2019-04-17

最新評論

老快3投注技巧