<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Quartz.Net 主要概念介紹和吐槽

      我們經(jīng)常遇到需要定時執(zhí)行某些任務的情況,比如清理緩存、異步結果輪詢等,如果不打算造輪子,那么選擇一款合適的定時任務組件就很關鍵了。所幸,.Net 世界中的選項并不多:)

      選型

      主要有以下四款:

      • Quartz.Net:移植自 Java 生態(tài)的 Quartz,久經(jīng)考驗、成熟穩(wěn)重,只是個人感覺有點過度設計,初次接觸容易讓人困惑;
      • Coravel:提供任務調(diào)度,緩存,排隊,郵件,事件廣播等功能,全面但不專一;
      • Hangfire:最大的特點是內(nèi)置控制面板。分為社區(qū)版和商用版。github 上,這四款組件它的點贊數(shù)最多,可見其收歡迎程度。不過它更像一個定時任務管理解決方案,所涵蓋的功能除任務本身,還涉及到賬戶管理、圖表管理、告警系統(tǒng)等;
      • FluentScheduler:似乎是這四款中最易上手的,但是已經(jīng)有段時間沒更新了。

      穩(wěn)妥起見,項目前期建議選擇坑少、專注、輕量、社區(qū)較為活躍的組件 Quartz.Net,再擇機使用 Hangfire 打造一個任務管理中心。

      如前所述,Quartz.Net 有過度設計的嫌疑,2.x 版本時期配置方式的雜亂可見一斑。雖然現(xiàn)在已經(jīng)迭代到 3.x,一些概念還是需要花心思理解下。

      主要概念

      我們圍繞下面這個代碼片段展開:

      var schedulerFactory = builder.Services.GetRequiredService<ISchedulerFactory>();
      var scheduler = await schedulerFactory.GetScheduler();
      
      // define the job and tie it to our HelloJob class
      var job = JobBuilder.Create<HelloJob>()
          .WithIdentity("myJob", "group1")
          .UsingJobData("way", "email")
          .Build();
      
      // Trigger the job to run now, and then every 40 seconds
      var trigger = TriggerBuilder.Create()
          .WithIdentity("myTrigger", "group1")
          .StartNow()
          .WithSimpleSchedule(x => x
              .WithIntervalInSeconds(40)
              .RepeatForever())
          .Build();
      
      await scheduler.ScheduleJob(job, trigger);
      

      Jobs and Triggers

      Quartz.Net 將任務業(yè)務邏輯(Jobs)和任務執(zhí)行時間計劃(Triggers)做了分離。官方的解釋是兩者可以獨立管理,還可以多個 Trigger 觸發(fā)同一個 Job;有沒有必要見仁見智

      Job 和 Trigger 還有group的概念,比如多個模塊都有各自清理緩存的任務,可以將這些任務劃分為同一個組。但是在實操過程中,group 除了語義上的指示,似乎并沒有直接的其它作用;也許它可以用于業(yè)務端的擴展,不過私以為組件不應將可能的業(yè)務需求作為自己的設計點,且業(yè)務擴展不應依賴某個具體組件

      JobDetail

      上述代碼中變量 job 的類型并非IJob,而是IJobDetail,也就是說,Quartz.Net 調(diào)度維持的是 IJobDetail 實例,而 Job 實例,是在每次任務執(zhí)行的時間點實例化的,執(zhí)行完就銷毀,實例狀態(tài)并不能延續(xù),需要借助 IJobDetail 實例存取每次執(zhí)行后更新的狀態(tài)。

      JobDataMap

      Job 實例狀態(tài)保存在 JobDataMap 中,構造 JobDetail 對象時使用 .UsingJobData(key, value) 定義鍵值對。Trigger 也有 JobDataMap,是為上面提到的———多個 Trigger 觸發(fā)同一個 Job——這種情況設計的。

      使用方式如下:

      public class HelloJob : IJob
      {
      	public async Task Execute(IJobExecutionContext context)
      	{
      		JobKey key = context.JobDetail.Key;
      
                      // 可使用 context.MergedJobDataMap 同時獲取 Trigger 提供的鍵值
      		JobDataMap dataMap = context.JobDetail.JobDataMap;
      
      		string way = dataMap.GetString("way");
      
      		await Console.Error.WriteLineAsync("Instance " + key + " of HelloJob is send by: " + way);
      	}
      }
      

      另外要注意的是,用來修飾 Job 類的特性DisallowConcurrentExecution,其實約束的是 JobDetail,即對于 JobDetail-A,同一時間,只能有一個 Job 使用它。也就是說,可以同時激活多個 HelloJob 對象,只要它們關聯(lián)的 JobDetail 不同即可(當然了,實際我們也只能操作多個不同的 JobDetail 去激活對應的 Job)。

      關于 JobDetail 的解釋,官方文檔寫得過于復雜,其實它的目的就是為了解決 Job 實例并非單例的問題,那么作者為什么不干脆將 Job 實例單例化呢?根本沒必要創(chuàng)造一個多余的 JobDetail 的概念,令人費解。如果是因為并發(fā)考量,那么應該從 Job 定義入手,加入多線程支持。

      如果項目中使用了 IOC,那么我們可以選擇不使用 JobDataMap,而是將實例狀態(tài)保存在自定義對象中,在每次實例化 Job 對象時注入。

      Misfire 處理方案

      當一個 Job 在規(guī)定時間點沒有被觸發(fā)執(zhí)行(比如線程池里面沒有可用的線程、Job 被暫停等),且超時時間超過 misfireThreshold 配置的值(默認為60秒),則作業(yè)會被調(diào)度程序認為Misfire

      當系統(tǒng)恢復后(有空閑線程、Job 被恢復等),調(diào)度程序會根據(jù)配置的 Misfire 策略處理已錯過的那些觸發(fā)點。

      參考資料

      Quartz misfire詳解

      posted @ 2023-02-24 10:23  萊布尼茨  閱讀(1923)  評論(14)    收藏  舉報
      主站蜘蛛池模板: 一区二区三区四区五区色| 国产精品成人午夜福利| 四虎国产精品永久在线下载| 日韩有码av中文字幕| 国产资源精品中文字幕| 国产成人高清亚洲综合| 久久亚洲色WWW成人男男| 亚洲色婷婷综合久久| xxxxbbbb欧美残疾人| 亚洲嫩模一区二区三区| 亚洲另类欧美综合久久图片区| 久久精品夜夜夜夜夜久久| 天津市| 亚欧洲乱码视频在线专区| 日韩高清国产中文字幕| 亚洲av成人无码精品电影在线| 国产精品久久久久久福利69堂| 欧美大屁股喷潮水xxxx| 亚洲这里只有久热精品伊人| 国产精品亚韩精品无码a在线| 18禁免费无码无遮挡网站| 武山县| 欧美人成精品网站播放| 日本三级理论久久人妻电影| 亚洲综合小说另类图片五月天| 国产精品免费看久久久 | 国产精品日韩专区第一页| 一个色综合色综合色综合| 亚洲国产成人精品女人久久久| 一区二区中文字幕久久| аⅴ天堂中文在线网| 亚洲av无码国产在丝袜线观看| 18禁动漫一区二区三区| caoporn免费视频公开| 少妇人妻av毛片在线看| 沧州市| 国产性色的免费视频网站| 精品中文人妻中文字幕| 精品人妻av区乱码| 综合图区亚洲另类偷窥| 一区二区三区不卡国产|