一篇學會cron表達式

来源:https://www.cnblogs.com/goodtimeggb/archive/2023/11/28/17862867.html
-Advertisement-
Play Games

1、定義 Cron表達式是一種用於定義定時任務的格式化字元串。它被廣泛用於Unix、Linux和類Unix系統中,用於在指定的時間執行預定的任務。Cron表達式由6個欄位組成,每個欄位通過空格分隔開。 在本文中,我們將學習如何理解和編寫Cron表達式。 Cron表達式的格式如下: * * * * * ...


1、定義

Cron表達式是一種用於定義定時任務的格式化字元串。它被廣泛用於Unix、Linux和類Unix系統中,用於在指定的時間執行預定的任務。Cron表達式由6個欄位組成,每個欄位通過空格分隔開。
在本文中,我們將學習如何理解和編寫Cron表達式。
Cron表達式的格式如下:

* * * * * *  
| | | | | |  
| | | | | +-- 星期(周日=0 或 7)  
| | | | +---- 月份(1-12)  
| | | +------ 日期(1-31)  
| | +-------- 小時(0-23)  
| +---------- 分鐘(0-59)  
+------------ 秒(0-59)

每個欄位可以使用數字來表示具體的值,也可以使用一些特殊字元來表示範圍、遞增等。

下麵是一些常用的特殊字元:

:代表所有可能的值,例如在小時欄位中表示每一個小時。
?:在日期和星期欄位中,表示不指定值。
-:表示範圍,例如在小時欄位中1-3表示1點到3點。
,:表示列舉值,例如在小時欄位中1,3,5表示1點、3點和5點。
/:表示遞增,例如在分鐘欄位中*/15表示每15分鐘。
下麵是一些示例Cron表達式:

1)每分鐘的第30秒執行任務:

30 * * * * *

2)每小時的第30分鐘執行任務:

* 30 * * * *

3)每天的凌晨1點執行任務:

0 1 * * *

4)每月的第1天的凌晨1點執行任務:

0 1 1 * *

5)每周一的凌晨1點執行任務:

0 1 * * 1

以上只是Cron表達式的一些基本示例,你可以根據自己的需求靈活組合各個欄位來定義複雜的定時任務。需要註意的是,Cron表達式的具體語法和支持的特殊字元可能因不同的系統或工具而有所差異,因此在實際使用時最好查閱相關文檔進行參考。

2、.NET代碼舉例

以下是一個使用.NET代碼的例子,演示如何創建和執行一個Cron表達式。
首先,你需要安裝一個用於解析和執行Cron表達式的.NET庫。常用的庫是NCrontab和Quartz,你可以通過NuGet包管理器將其添加到你的項目中。
安裝完成後,你可以使用以下代碼創建一個Cron表達式,並生成一個對應的定時任務。

1)NCrontab

1、安裝NCrontab庫

2、NCrontabUtil工具類

/// <summary>
/// NCrontab解析Cron表達式
/// 不支持秒級
/// </summary>
public static class NCrontabUtil
{
    /// <summary>
    /// 執行NCrontab解析
    /// </summary>
    /// <param name="cronExpression">Cron表達式</param>
    public static void ExecuteNCrontab(string cronExpression)
    {
        // 解析Cron表達式  
        CrontabSchedule schedule = CrontabSchedule.Parse(cronExpression);

        // 獲取當前時間  
        DateTime currentTime = DateTime.Now;

        // 計算下一個執行時間  
        DateTime nextOccurrence = schedule.GetNextOccurrence(currentTime);

        Console.WriteLine("下一個執行時間:" + nextOccurrence.ToString());

        // 在下一個執行時間執行任務  
        // 這裡只是簡單列印一條消息作為示例任務  
        Action task = () => Console.WriteLine("執行任務...");
        task.Invoke();
    }
}

3、調用

// 創建一個Cron表達式
string cronExpression = "";

// NCrontab 不支持秒級
// 在每小時的第一分鐘執行任務。這個表達式具體表示在每小時的第一分鐘(例如01:01、02:01、03:01等)觸發執行相應的任務
// 其他欄位的值使用星號()表示,意味著對應欄位的所有可能值都被匹配,即任務在每個小時都會執行
cronExpression = "1 * * * *";
NCrontabUtil.ExecuteNCrontab(cronExpression);

4、結果

2)Quartz(推薦使用,支持6為表達式->支持秒級)

1、安裝Quartz庫

2、QuartzUtil工具類

/// <summary>
/// Quartz解析Cron表達式
/// 支持秒級
/// </summary>
public static class QuartzUtil
{
    /// <summary>
    /// 執行Quartz解析
    /// </summary>
    /// <param name="cronExpression">Cron表達式</param>
    public async static void ExecuteQuartz(string cronExpression)
    {
        // 創建調度器工廠
        var schedulerFactory = new StdSchedulerFactory();
        // 獲取調度器  .ConfigureAwait(false)避免死鎖,下同
        var scheduler = await schedulerFactory.GetScheduler().ConfigureAwait(false);
        // 開啟調度器
        await scheduler.Start().ConfigureAwait(false);
        // 創建作業
        var job = JobBuilder.Create<MyJob>()
            .WithIdentity("myJob")
            .Build();
        // 創建觸發器,並設置CRON表達式
        var trigger = TriggerBuilder.Create()
            .WithIdentity("myTrigger")
            .WithCronSchedule(cronExpression)  
            .Build();

        // 將作業和觸發器關聯到調度器中
        await scheduler.ScheduleJob(job, trigger).ConfigureAwait(false);

        // 保持主程式的運行,以便調度器持續執行任務  
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();

        // 關閉調度器
        await scheduler.Shutdown().ConfigureAwait(false);
    }

    // 創建作業類
    public class MyJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            // 在這裡編寫每秒要執行的代碼
            if (context.NextFireTimeUtc.HasValue)
            {
                Console.WriteLine("執行任務中...下一次執行任務時間" + context.NextFireTimeUtc.Value.ToLocalTime().DateTime.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            else
            {
                Console.WriteLine("執行任務中...下一次執行任務時間未知");
            }
            await Task.CompletedTask;
        }
    }
}

3、調用

// 創建一個Cron表達式
string cronExpression = "";

// Quartz 支持秒級
// 每秒執行一次的CRON表達式  
cronExpression = "0/1 * * * * ?";
QuartzUtil.ExecuteQuartz(cronExpression);

4、結果

希望本文能幫助你學會理解和編寫Cron表達式,以便在系統中實現定時任務的自動化執行。

本文來自博客園,作者:GoodTimeGGB,轉載請註明原文鏈接:https://www.cnblogs.com/goodtimeggb/p/17862867.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是 Java陳序員。 我們都知道,現在開發中,前後端分離是主流趨勢。 在企業開發中,一般是前後端雙方約定好介面交互的信息,根據介面文檔自行開發。這樣並行開發,能大大提高工作效率! 但是,理想很豐滿,現實很骨感!往往後端介面還沒開發好,前端小姐姐就在催後端介面要返回的數據。 本來我後端就沒開 ...
  • AES(Advanced Encryption Standard)是一種對稱加密演算法,它是目前廣泛使用的加密演算法之一。AES演算法是由美國國家標準與技術研究院(NIST)於2001年發佈的,它取代了原先的DES(Data Encryption Standard)演算法,成為新的標準。AES是一種對稱加密... ...
  • 【先來個小測試】 大家覺得下麵的sql返回什麼? select * from table1 where null=1 答案:無返回。因為null=1是個false的表達式。這就像我們寫where 1=2一樣。 【↓↓正文開始↓↓】 需求開發完成,將開發分支merge到test分支,部署測試環境提測後 ...
  • 原文 : https://openaigptguide.com/chatgpt-aigc-difference/ AIGC 和 ChatGPT 都是人工智慧技術,但它們的功能和應用場景不同。 AIGC(AI-GeneratedContent,人工智慧自動生成內容)是人工智慧、電腦圖形學和深度學習等 ...
  • 你可以使用 Python 中的列表拼接操作來合併兩個或多個列表。Python 提供了幾種方式來實現列表的拼接,包括使用 + 運算符、extend() 方法和列表解析。 以下是這些方法的示例: 1.使用 + 運算符: list1 = [1, 2, 3] list2 = [4, 5, 6] concat ...
  • Python還提供了許多其他用於數據處理和轉換的內置函數和模塊。以下是一些常用的數據處理函數和模塊: sorted sorted(iterable, key=func, reverse=False) 用於對可迭代對象進行排序。你可以指定一個可選的 key 函數來自定義排序規則,以及一個可選的 rev ...
  • HTTP(Hypertext Transfer Protocol)是一種用於傳輸超文本的協議。它是一種無狀態的、應用層的協議,用於在電腦之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 伺服器之間進行數據通信。HTTP 是由互聯網工程任務組(IETF)定義的,它是基於客戶端-伺服器模型的協議,... ...
  • 通過實現一個簡易版本的跳錶,可以加深了對Python編程的理解。跳錶是一種跳躍式的數據結構,通過索引層提供快速查找的能力,提高了查找的效率。在實現跳錶的過程中,會更加熟悉了Python的語法和特性,並且可以更加靈活地運用它來解決實際問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...