.NET Core能夠建立「定時」後臺服務在 ASP.NET Core 中使用託管服務實現後臺任務(例如,每10分鐘運行一次任務),可是自帶的後臺服務應用場景太侷限。在實際場景中,咱們一般須要指定更復雜的時間參數。例如 凌晨2點30,天天的上午10點,每兩小時一次,當處理這些複雜的時間時,自帶的解決方案就顯得格格不入了。html
爲些Quartz.NET提供了強大的解決方案, 經過使用Cron表達式,您能夠確保任務在特定時間運行,或僅在特定的幾天運行,或這些時間的任意組合。java
Quart.Net介紹
概述
Quartz主要有三部分組成任務(Job)、觸發器(Trigger)和調度器(Schedule)。程序員
任務
Job就是執行的做業,Job須要繼承IJob接口,實現Execute方法。Job中執行的參數從Execute方法的參數中獲取。數據庫
觸發器
觸發器經常使用的有兩種:SimpleTrigger觸發器和CronTrigger觸發器。json
調度器
調度器就是將任務和觸發器綁定,讓觸發器觸發的時候去執行任務。上一個簡單的案例app
案例
一、首先Nuget包引用
nuget install Quartz.AspNetCore
二、定義一個Job任務
/// <summary> /// 建立IJob的實現類,並實現Excute方法 /// </summary> public class TestJob : IJob { public Task Execute(IJobExecutionContext context) { return Task.Run(() => { Console.WriteLine("output testjob log"); }); } }
三、Api控制器調用方法建立任務
[Route("quart")] [ApiController] public class QuartController : Controller { private readonly ISchedulerFactory _schedulerFactory; public QuartController(ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } [HttpGet("CreateTask")] public async Task<IActionResult> CreateTask() { //經過調度工廠得到調度器 var _scheduler = await _schedulerFactory.GetScheduler(); //開啓調度器 await _scheduler.Start(); //建立一個觸發器 var trigger = TriggerBuilder.Create() .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每兩秒執行一次 .Build(); //建立任務 var jobDetail = JobBuilder.Create<TestJob>() .WithIdentity("job", "group") .Build(); //將觸發器和任務器綁定到調度器中 await _scheduler.ScheduleJob(jobDetail, trigger); return new JsonResult(new { success = true }); } }
調用 localhost://quart/createtask 便可以看控制檯看到每隔倆秒鐘輸出一段控制檯信息。async
實例使用場景
上述的案例是一種經過本身建立三元素的方式來建立任務,在一些通用場景下其實咱們只關心定時任務的邏輯和執行的頻率,其餘我能夠不考慮。工具
即領導給了我一個任務,任務的功能是:開發一個定時任務,天天02:30執行,清理數據庫歷史記錄。那麼開發者最方便的方式是什麼?visual-studio
僞代碼
一、定義執行Job測試
class CleanJob{ [cron表達式] public void cleanDatabase(){ 業務邏輯 } }
二、注入任務
services.Register(typeof(CleanJob))
如何可以經過這樣的方式實現是最好的,可是現實是NetCore的quart.net如今還不支持這樣的定義方式,java好像是能夠的。
那有沒有其餘相似的方式能夠實現上面的效果呢?
我給你們推薦一種方式
案例說明
一、定義一個初始化配置的服務註冊
public static class QuartzIocExtend { public static void AddJobAndTrigger<T>(this IServiceCollectionQuartzConfigurator quartz, IConfiguration config, string category = "Default") w { string quartKey = "Quartz"; // 泛型Job的name string jobName = typeof(T).Name; // 從appsetting.json中獲取任務job的corn執行表達式 var configKey = $"{quartKey}:{category}:{jobName}"; var cronSchedule = config[configKey]; // 校驗cron表達式存在 if (string.IsNullOrEmpty(cronSchedule)) { throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}"); } // 註冊job var jobKey = new JobKey(jobName); quartz.AddJob<T>(opts => opts.WithIdentity(jobKey)); //爲job添加調度器 quartz.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity(jobName + "-cron-trigger") .WithCronSchedule(cronSchedule)); }
二、ConfigureServices中註冊
//quartz 定時服務 services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); q.AddJobAndTrigger<TestJob>(configuration); });
三、配置文件定義cron表達式
"Quartz": { "Default": { //5秒鐘執行一次 "TestJob":"0/5 * * * * ? *" } }
四、執行測試
測試結果正確,每五秒鐘輸出文本
參考
在ASP.NET Core中建立基於Quartz.NET託管服務輕鬆實現做業調度
最後
本文到此結束,但願對你有幫助 😃
若是還有什麼疑問或者建議,能夠多多交流,原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知。
更多精彩技術文章彙總在個人 公衆號【程序員工具集】,持續更新,歡迎關注訂閱收藏。