Core如何集成定時任務處理庫Quart?

.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 * * * * ? *"
  }
}

四、執行測試

測試結果正確,每五秒鐘輸出文本

參考

Quart.net官方文檔

在.NET Core 中使用Quartz.NET

.Net Core中使用Quartz.NET

Quartz.Net使用教程

在ASP.NET Core中建立基於Quartz.NET託管服務輕鬆實現做業調度

最後

本文到此結束,但願對你有幫助 😃

若是還有什麼疑問或者建議,能夠多多交流,原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知。

更多精彩技術文章彙總在個人 公衆號【程序員工具集】,持續更新,歡迎關注訂閱收藏。

wechat.png

相關文章
相關標籤/搜索