写点什么

一篇学会 cron 表达式

  • 2023-11-29
    福建
  • 本文字数:2511 字

    阅读完需:约 8 分钟

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

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一篇学会cron表达式_表达式_不在线第一只蜗牛_InfoQ写作社区