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