1. 程式人生 > >在dotnet core實現類似crontab的定時任務

在dotnet core實現類似crontab的定時任務

  前段需要在業務中實現某些時間段的簡單定時任務,類似crontab的排程,因為業務會放在docker中,所以不想用直接用crontab,在網上搜了一下,發現一個開源的實現 Pomelo.AspNetCore.TimedJob,使用簡單,但是因為是時間間隔執行,不太符合指定時間段要求,不過感謝此開原始碼和作者,我在其基礎上重新擼了個crontab的實現,並增加了一些功能,程式碼已放在Github上。

    原始碼地址:https://github.com/aquilahkj/Light.Cron

    使用Demo:https://github.com/aquilahkj/Light.Cron/tree/master/sample/Light.Cron.Sample

    首先通過Nuget安裝

PM> Install-Package Light.Cron

  配置StartUp

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public IConfiguration Configuration { get; }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddCrontabJob();
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCrontabJob();
        app.UseMvc();
    }
}

  編寫crontab方法

[CrontabJob]
public class CrontabObject
{
    [CrontabSchedule("crontab1", "* * * * *")]
    public void DoSomeThing()
    {
        // Todo
    }
}

  即可完成每分鐘呼叫一次的定時任務

Light.Cron完全相容Linux Crontab時間格式

*  *  *  *  *
分 時 日 月 周

第1列表示分鐘0~59

第2列表示小時0~23

第3列表示日期1~31

第4列表示月份1~12

第5列標識號星期0~7(0和7表示星期天)

每天10點至16點 
0 10-16 * * *

每隔兩個小時 
0 */2 * * *

並在此基礎上對一直以來在crontab使用上的一些痛點進行了功能增強

跨時間段

當時間段格式出現結束時間小於開始時間, 則代表由開始時間到下一級時間的開始時間, 如

每月1號22點到2號4點之間的時間段
* 22-4 1 * * 
每週一至週五晚上22點到次日4點之間的時間段, 裡面包含週六的0點-4點, 不包含週一的0點-4點
* 22-4 * * 1-5

月末日期

日期格式中增加新增e標記作為月末最後一天, 並且可以通過e+數字代表最後一天再往前倒數天數, 如當月共31天, 則e=31, e1=30, e2=29, e3=28. 當月共30天, 則e=30, e1=29, e2=28, e3=27. 該語法同樣支援範圍

每月1日、15日和最後一日
0 0 1,15,e * *
倒數第4天至倒數第2天
0 0 e3-e1 * *

時間範圍

Light.Cron可以通過新語法HH:mm-HH:mm將時分結合, 替換原有的時分設定, 如

每日9點30分至15點0分, 每隔一分鐘執行一次
09:30-15:00 * * *
每日21點30分至次日的5點30分, 每隔5分鐘執行一次
21:30-05:30/5 * * *

多組排程計劃

Light.Cron可以通過|符號支援多組排程計劃, 如

0點至11點, 每分鐘執行一次, 12點至23點, 每5分鐘執行一次
* 0-11 * * *|*/5 12-23 * * *

簡略寫法

如下一級及其以之後的時間範圍都是*, 可以簡略不寫, 如

* * * * * = *
30 9 * * * = 30 9
09:30-15:00 * * * = 09:30-15:00
0 0 1 * * = 0 0 1
0 0 1 2-5 * = 0 0 1 2-5