一篇学会cron表达式

1、定义

Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中,用于在指定的时间执行预定的任务。Cron表达式由6个字段组成,每个字段通过空格分隔开。
在本文中,我们将学习如何理解和编写Cron表达式。
Cron表达式的格式如下:

* * * * * *  
| | | | | |  
| | | | | +-- 星期(周日=07| | | | +---- 月份(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表达式,以便在系统中实现定时任务的自动化执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java高级技术(单元测试)

一&#xff0c;概括 二&#xff0c;junit 三&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;实验类 package com.bilibili;public class Name {public static void main(String name) {if (name null){System.out.println("0");return;}System.out.print…

电子学会C/C++编程等级考试2022年06月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:制作蛋糕 小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单位的糖,150个单位的黄…

MyBatis-Plus条件构造器

说明 Wrapper&#xff1a;条件构造抽象类&#xff0c;最顶端父类AbstractWrapper&#xff1a;用于查询条件封装&#xff0c;生成sql的where条件QueryWrapper&#xff1a;查询条件封装UpdateWrapper&#xff1a;更新条件封装AbstractLambdaWrapper&#xff1a;使用Lambda语法La…

基本数据结构二叉树(3)

目录 4.二叉树链式结构的操作 4.1 前置说明 4.2二叉树的遍历 4.2.1 前序、中序以及后序遍历 4.3 节点个数以及高度等 4.二叉树链式结构的操作 4.1 前置说明 由于博主对二叉树的结果掌握还不够深入&#xff0c;因此在讲解相关操作前将手动创建一颗简单的二叉树&#xff0c…

【传智杯】儒略历、评委打分、萝卜数据库题解

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样唾手…

地大与明道云的实践:零代码产教融合与协同育人

摘要 中国地质大学&#xff08;武汉&#xff09;与明道云合作&#xff0c;通过建设数字学院的方式&#xff0c;塑造教育数字化新动能。具体实践包括&#xff1a; 联合建设数字学院&#xff1a;选择经济管理学院作为试点&#xff0c;通过统筹规划、统一标准、分步实施的方式&a…

centos 显卡驱动安装(chatglm2大模型安装步骤一)

1.服务器配置 服务器系统:Centos7.9 x64 显卡:RTX3090 (24G) 2.安装环境 2.1 检查显卡驱动是否安装 输入命令:nvidia-smi(显示显卡信息) 如果有以下显示说明,已经有显卡驱动。否则需要重装。 2.2 下载显卡驱动 第一步:浏览器输入https://www.nvidia.cn/Downloa…

vue+elementUI的tabs与table表格联动固定与滚动位置

有个变态的需求&#xff0c;要求tabs左侧固定&#xff0c;右侧是表格&#xff0c;点击左侧tab&#xff0c;右侧表格滚动到指定位置&#xff0c;同时&#xff0c;右侧滚动的时候&#xff0c;左侧tab高亮相应的item 上图 右侧的高度非常高&#xff0c;内容非常多 常规的瞄点不适…

高级JVM

一、Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 首先先了解电脑是二进制的系统&#xff0c;他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的&#xff0c;我们人可以认识&#xff0c;但是电脑不…

C语言——数字金字塔

实现函数输出n行数字金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void pyramid(int n) {int i,j,k;for (i1; i<n; i){//输出左边空格&#xff0c;空格数为n-i for (j1; j<n-i; j){printf(" "); } //每一行左边空格输完后输出数字&#…

C++初阶模板

介绍&#xff1a; 我们先认识以下C中的模板。模板是一种编程技术&#xff0c;允许程序员编写与数据类型无关的代码&#xff0c;它是一种泛型编程的方式&#xff0c;可以用于创建可处理多种数据类型的函数或类&#xff0c;也就是说泛型编程就是编写与类型无关的通用代码&#xf…

第一百八十二回 自定义一个可以滑动的刻度尺

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法3. 示例代码4. 内容总结我们在上一章回中介绍了"如何绘制阴影效果"相关的内容,本章回中将介绍 如何自定义一个可以滑动的刻度尺.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 任何优美的文字在图…

1128. 等价多米诺骨牌对的数量

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/number-of-equivalent-domino-pa…

模拟退火算法应用——求解TSP问题

仅作自己学习使用 一、问题 旅行商问题(TSP) 是要求从一个城市出发&#xff0c;依次访问研究区所有的城市&#xff0c;并且只访问一次不能走回头路&#xff0c;最后回到起点&#xff0c;求一个使得总的周游路径最短的城市访问顺序。 采用模拟退火算法求解TSP问题&#x…

入侵redis之准备---Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制

入侵redis之准备—Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制 几点需要知道的信息 【1】crontab一般来说服务器都是有的&#xff0c;依赖crond服务&#xff0c;这个服务也是必须安装的服务&#xff0c;并且也是开机自启动的服务&#xff0c;也就是说&…

51单片机制作数字频率计

文章目录 简介设计思路工作原理Proteus软件仿真软件程序实验现象测量误差和范围总结 简介 数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的&#xff0c;这种电路一般运行较慢&#xff0c;而且测量频率的范围较小。这…

Mybatis网址

Mybatis中文网&#xff1a;MyBatis中文网https://mybatis.net.cn/Mybatis Git 地址&#xff1a;MyBatis GitHubMyBatis has 37 repositories available. Follow their code on GitHub.https://github.com/mybatis

unity学习笔记06

一、预制体 1.定义&#xff1a; 预制体是一种存储了一个或多个游戏对象及其组件的资产。可以将预制体视为游戏对象的模板&#xff0c;它包含了对象的所有属性、组件和初始状态。 2.创建预制体&#xff1a; 在Unity中&#xff0c;可以通过将一个或多个游戏对象拖动到项目窗口…

如何在Ubuntu系统上安装YApi

简单介绍 YApi是高效、易用、功能强大的api管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护API&#xff0c;YApi还为用户提供了优秀的交互体验&#xff0c;开发人员只需利用平台提供的接口数据写入工具以及简单的…

Apipost也出IDEA插件了?Apipost-Helper!

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…