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);