• <button id="eiyoe"><acronym id="eiyoe"></acronym></button>
    <em id="eiyoe"></em>

  • <rp id="eiyoe"><acronym id="eiyoe"><input id="eiyoe"></input></acronym></rp>
      查看: 136|回復: 0
      上一主題 下一主題

      Quartz.NET的具體使用

      79910

      主題

      0

      好友

      積分

      離線 發信

      跳轉到指定樓層
      樓主
      發表于 2021-09-17 10:50 | 只看該作者 | 倒序瀏覽
      目錄
      • 一、什么是Quartz.NET?
      • 二、Quartz.NET可以做什么?
      • 三、ASP.NET Core如何使用Quartz.NET?
      • 四、Quartz的cron表達式

      一、什么是Quartz.NET?

      Quartz.NET 是一個功能齊全的開源作業調度系統,可用于從最小的應用程序到大型企業系統。

      Quartz.NET是純凈的,它是一個.Net程序集,是非常流行的Java作業調度系統Quartz的C#實現。

      二、Quartz.NET可以做什么?

      Quartz.NET很多特征,如:數據庫支持,集群,插件,支持cron-like表達式等等,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。

      Quartz.NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關系,還能把多個作業與不同的觸發器關聯。

      Quartz.NET的應用程序可以重用來自不同事件的作業,還可以為一個事件組合多個作業。

      我此次選擇Quartz.Net使用的版本是 3.3.3

      這里強調一點:3.x的版本與2.x的版本使用方式有一定的差別

      Quartz.NET官方文檔:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html

      三、ASP.NET Core如何使用Quartz.NET?

      首先我們需要創建一個ASP.NET Core web的項目,創建的過程就不展示了,我創建的是API項目,使用傳統三層架構。

      項目創建好后,我們需要在NuGet包管理器中安裝Quartz.AspNetCore和Quartz.Extensions.DependencyInjection


      與2.x的使用方式不同,因為我使用的版本是3.3.3(此時最新版本)。我們就不像傳統的創建調度中心類。傳統的是定義作業工廠類【ResetJobFactory】,控制中心類【SchedulerCenter】,以及定期工作類【RegularWork】(如下圖)在這就不過多介紹了。

      只需創建一個定期工作類【RegularWork】,并且繼承Quartz.net的IJob接口,I_RegularWork_BLL能注入到RegularWork內需要UseMicrosoftDependencyInjectionJobFactory.

       public class RegularWork : IJob
          {
          private readonly I_RegularWork_BLL I_bll;
          public RegularWork(I_RegularWork_BLL Ibll)
          {
              I_bll = Ibll;
          }
       
          public Task Execute(IJobExecutionContext context)
          {
              Input_RoomType model = new Input_RoomType();
              model.currentPage = 1;
              model.pageSize = 1;
              var result = I_bll.getRoomTypeList(model);
       
              return Task.Run(() =>
              {
                  using (StreamWriter sw = new StreamWriter(@"F:/Quartz-NET.txt", true, Encoding.UTF8))
                  {
                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff =>") + JsonConvert.SerializeObject(result));
                  }
              });
          }
      }

      在Startup.cs的ConfigureServices方法內通過services去注冊RegularWork

      //Quartz的工作單元
       services.AddTransient<RegularWork>();

      ConfigureServices方法內新增Quartz調度中心。Quartz.Extensions.DependencyInjection提供與Microsoft 依賴注入的集成,雖然Quartz 為作業工廠提供了兩個內置替代方案,可以通過調用UseMicrosoftDependencyInjectionJobFactory或UseMicrosoftDependencyInjectionScopedJobFactory(已棄用)進行配置。

      從 Quartz.NET 3.3.2 開始,默認作業工廠生成的所有作業都是作用域作業,不應再使用UseMicrosoftDependencyInjectionScopedJobFactory。

      AddJob-新增一個工作單元;StartNow表示作業現在就開始執行;

      WithInterval用于執行時間策略執行規則;

      TimeSpan.FromSeconds表示執行的時間間隔,秒為單位;RepeatForever代表重復工作,可以用WithRepeatCount(5)代替RepeatForever;WithRepeatCount(5)代表執行5次

        //Quartz調度中心
          services.AddQuartz(q =>
          {
              //用于注入
              q.UseMicrosoftDependencyInjectionJobFactory();
              // 基本Quartz調度器、作業和觸發器配置
              var jobKey = new JobKey("RegularWork", "regularWorkGroup");
              q.AddJob<RegularWork>(jobKey, j => j
                  .WithDescription("My regular work")
              );
              q.AddTrigger(t => t
                  .WithIdentity("Trigger")
                  .ForJob(jobKey)
                  .StartNow()
                  .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//開始秒數 10s
                  .RepeatForever())//持續工作
                  .WithDescription("My regular work trigger")
              );
      });           

      ConfigureServices方法內新增添加Quartz服務

      // ASP.NET核心托管-添加Quartz服務器
       services.AddQuartzServer(options =>
       {
           // 關閉時,我們希望作業正常完成
           options.WaitForJobsToComplete = false;
       });

      完整代碼

      //Quartz的工作單元
          services.AddTransient();
          //Quartz調度中心
          services.AddQuartz(q =>
          {
              //用于注入
              q.UseMicrosoftDependencyInjectionJobFactory();
              // 基本Quartz調度器、作業和觸發器配置
              var jobKey = new JobKey("RegularWork", "regularWorkGroup");
              q.AddJob(jobKey, j => j
                  .WithDescription("My regular work")
              );
              q.AddTrigger(t => t
                  .WithIdentity("Trigger")
                  .ForJob(jobKey)
                  .StartNow()
                  .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//開始秒數 10s
                  .WithRepeatCount(5))//持續工作
                  .WithDescription("My regular work trigger")
              );
      });
      // ASP.NET核心托管-添加Quartz服務
      services.AddQuartzServer(options =>
      {
          // 關閉時,我們希望作業正常完成
          options.WaitForJobsToComplete = false;
      });

      這時候我們啟動項目,定期工作開始執行。這時候的注入是有效的,查詢數據后結果打印在F盤下的Quartz-NET.txt文件內(如下圖)。

      四、Quartz的cron表達式

      官方的文檔介紹:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

      由7段構成:秒 分 時 日 月 星期 年(可選)
      "-" :表示范圍 MON-WED表示星期一到星期三
      "," :表示列舉 MON,WEB表示星期一和星期三
      "*" :表是“每”,每月,每天,每周,每年等
      "/" :表示增量:0/15(處于分鐘段里面) 每15分鐘,在0分以后開始,3/20 每20分鐘,從3分鐘以后開始
      "?" :只能出現在日,星期段里面,表示不指定具體的值
      "L" :只能出現在日,星期段里面,是Last的縮寫,一個月的最后一天,一個星期的最后一天(星期六)
      "W" :表示工作日,距離給定值最近的工作日
      "#" :表示一個月的第幾個星期幾,例如:"6#3"表示每個月的第三個星期五(1=SUN...6=FRI,7=SAT)

      Expression Meaning
      0 0 12 * * ? 每天中午12點觸發
      0 15 10 ? * * 每天上午10:15觸發
      0 15 10 * * ? 每天上午10:15觸發
      0 15 10 * * ? * 每天上午10:15觸發
      0 15 10 * * ? 2005 2005年的每天上午10:15觸發
      0 * 14 * * ? 在每天下午2點到下午2:59期間的每1分鐘觸發
      0 0/5 14 * * ? 在每天下午2點到下午2:55期間的每5分鐘觸發
      0 0/5 14,18 * * ? 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
      0 0-5 14 * * ? 在每天下午2點到下午2:05期間的每1分鐘觸發
      0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發
      0 15 10 ? * MON-FRI 周一至周五的上午10:15觸發
      0 15 10 15 * ? 每月15日上午10:15觸發
      0 15 10 L * ? 每月最后一日的上午10:15觸發
      0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
      0 15 10 ? * 6L 每月的最后一個星期五上午10:15觸發
      0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
      0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一個星期五上午10:15觸發
      0 15 10 ? * 6#3 每月的第三個星期五上午10:15觸發
      0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
      0 11 11 11 11 ? Fire every November 11th at 11:11am.

      到此這篇關于Quartz.NET的具體使用的文章就介紹到這了,更多相關Quartz.NET使用內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

      來源:http://www.jb51.net/article/219426.htm