一篇学会cron表达式
1、定義
Cron表達(dá)式是一種用于定義定時(shí)任務(wù)的格式化字符串。它被廣泛用于Unix、Linux和類Unix系統(tǒng)中,用于在指定的時(shí)間執(zhí)行預(yù)定的任務(wù)。Cron表達(dá)式由6個(gè)字段組成,每個(gè)字段通過(guò)空格分隔開。
在本文中,我們將學(xué)習(xí)如何理解和編寫Cron表達(dá)式。
Cron表達(dá)式的格式如下:
* * * * * *
| | | | | |
| | | | | +-- 星期(周日=0 或 7)
| | | | +---- 月份(1-12)
| | | +------ 日期(1-31)
| | +-------- 小時(shí)(0-23)
| +---------- 分鐘(0-59)
+------------ 秒(0-59)
每個(gè)字段可以使用數(shù)字來(lái)表示具體的值,也可以使用一些特殊字符來(lái)表示范圍、遞增等。
下面是一些常用的特殊字符:
:代表所有可能的值,例如在小時(shí)字段中表示每一個(gè)小時(shí)。
?:在日期和星期字段中,表示不指定值。
-:表示范圍,例如在小時(shí)字段中1-3表示1點(diǎn)到3點(diǎn)。
,:表示列舉值,例如在小時(shí)字段中1,3,5表示1點(diǎn)、3點(diǎn)和5點(diǎn)。
/:表示遞增,例如在分鐘字段中*/15表示每15分鐘。
下面是一些示例Cron表達(dá)式:
1)每分鐘的第30秒執(zhí)行任務(wù):
30 * * * * *
2)每小時(shí)的第30分鐘執(zhí)行任務(wù):
* 30 * * * *
3)每天的凌晨1點(diǎn)執(zhí)行任務(wù):
0 1 * * *
4)每月的第1天的凌晨1點(diǎn)執(zhí)行任務(wù):
0 1 1 * *
5)每周一的凌晨1點(diǎn)執(zhí)行任務(wù):
0 1 * * 1
以上只是Cron表達(dá)式的一些基本示例,你可以根據(jù)自己的需求靈活組合各個(gè)字段來(lái)定義復(fù)雜的定時(shí)任務(wù)。需要注意的是,Cron表達(dá)式的具體語(yǔ)法和支持的特殊字符可能因不同的系統(tǒng)或工具而有所差異,因此在實(shí)際使用時(shí)最好查閱相關(guān)文檔進(jìn)行參考。
2、.NET代碼舉例
以下是一個(gè)使用.NET代碼的例子,演示如何創(chuàng)建和執(zhí)行一個(gè)Cron表達(dá)式。
首先,你需要安裝一個(gè)用于解析和執(zhí)行Cron表達(dá)式的.NET庫(kù)。常用的庫(kù)是NCrontab和Quartz,你可以通過(guò)NuGet包管理器將其添加到你的項(xiàng)目中。
安裝完成后,你可以使用以下代碼創(chuàng)建一個(gè)Cron表達(dá)式,并生成一個(gè)對(duì)應(yīng)的定時(shí)任務(wù)。
1)NCrontab
1、安裝NCrontab庫(kù)
2、NCrontabUtil工具類
/// <summary>
/// NCrontab解析Cron表達(dá)式
/// 不支持秒級(jí)
/// </summary>
public static class NCrontabUtil
{
/// <summary>
/// 執(zhí)行NCrontab解析
/// </summary>
/// <param name="cronExpression">Cron表達(dá)式</param>
public static void ExecuteNCrontab(string cronExpression)
{
// 解析Cron表達(dá)式
CrontabSchedule schedule = CrontabSchedule.Parse(cronExpression);
// 獲取當(dāng)前時(shí)間
DateTime currentTime = DateTime.Now;
// 計(jì)算下一個(gè)執(zhí)行時(shí)間
DateTime nextOccurrence = schedule.GetNextOccurrence(currentTime);
Console.WriteLine("下一個(gè)執(zhí)行時(shí)間:" + nextOccurrence.ToString());
// 在下一個(gè)執(zhí)行時(shí)間執(zhí)行任務(wù)
// 這里只是簡(jiǎn)單打印一條消息作為示例任務(wù)
Action task = () => Console.WriteLine("執(zhí)行任務(wù)...");
task.Invoke();
}
}
3、調(diào)用
// 創(chuàng)建一個(gè)Cron表達(dá)式
string cronExpression = "";
// NCrontab 不支持秒級(jí)
// 在每小時(shí)的第一分鐘執(zhí)行任務(wù)。這個(gè)表達(dá)式具體表示在每小時(shí)的第一分鐘(例如01:01、02:01、03:01等)觸發(fā)執(zhí)行相應(yīng)的任務(wù)
// 其他字段的值使用星號(hào)()表示,意味著對(duì)應(yīng)字段的所有可能值都被匹配,即任務(wù)在每個(gè)小時(shí)都會(huì)執(zhí)行
cronExpression = "1 * * * *";
NCrontabUtil.ExecuteNCrontab(cronExpression);
4、結(jié)果
2)Quartz(推薦使用,支持6為表達(dá)式->支持秒級(jí))
1、安裝Quartz庫(kù)
2、QuartzUtil工具類
/// <summary>
/// Quartz解析Cron表達(dá)式
/// 支持秒級(jí)
/// </summary>
public static class QuartzUtil
{
/// <summary>
/// 執(zhí)行Quartz解析
/// </summary>
/// <param name="cronExpression">Cron表達(dá)式</param>
public async static void ExecuteQuartz(string cronExpression)
{
// 創(chuàng)建調(diào)度器工廠
var schedulerFactory = new StdSchedulerFactory();
// 獲取調(diào)度器 .ConfigureAwait(false)避免死鎖,下同
var scheduler = await schedulerFactory.GetScheduler().ConfigureAwait(false);
// 開啟調(diào)度器
await scheduler.Start().ConfigureAwait(false);
// 創(chuàng)建作業(yè)
var job = JobBuilder.Create<MyJob>()
.WithIdentity("myJob")
.Build();
// 創(chuàng)建觸發(fā)器,并設(shè)置CRON表達(dá)式
var trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.WithCronSchedule(cronExpression)
.Build();
// 將作業(yè)和觸發(fā)器關(guān)聯(lián)到調(diào)度器中
await scheduler.ScheduleJob(job, trigger).ConfigureAwait(false);
// 保持主程序的運(yùn)行,以便調(diào)度器持續(xù)執(zhí)行任務(wù)
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
// 關(guān)閉調(diào)度器
await scheduler.Shutdown().ConfigureAwait(false);
}
// 創(chuàng)建作業(yè)類
public class MyJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
// 在這里編寫每秒要執(zhí)行的代碼
if (context.NextFireTimeUtc.HasValue)
{
Console.WriteLine("執(zhí)行任務(wù)中...下一次執(zhí)行任務(wù)時(shí)間" + context.NextFireTimeUtc.Value.ToLocalTime().DateTime.ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
Console.WriteLine("執(zhí)行任務(wù)中...下一次執(zhí)行任務(wù)時(shí)間未知");
}
await Task.CompletedTask;
}
}
}
3、調(diào)用
// 創(chuàng)建一個(gè)Cron表達(dá)式
string cronExpression = "";
// Quartz 支持秒級(jí)
// 每秒執(zhí)行一次的CRON表達(dá)式
cronExpression = "0/1 * * * * ?";
QuartzUtil.ExecuteQuartz(cronExpression);
4、結(jié)果
希望本文能幫助你學(xué)會(huì)理解和編寫Cron表達(dá)式,以便在系統(tǒng)中實(shí)現(xiàn)定時(shí)任務(wù)的自動(dòng)化執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的一篇学会cron表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦见指甲和肉分开了怎么回事
- 下一篇: 梦见自己买了一条大船是什么意思