深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践20241120
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践
任务调度是后台服务中的重要组成部分,无论是定期数据备份、日志归档还是周期性报表生成,Cron 表达式始终是描述这些任务规则的核心工具。本文将聚焦 Spring Cron 表达式的高级用法,并通过与 Linux Crontab 的全面对比,探讨它们的异同、使用场景及实现技巧。同时补充实用的 Linux Crontab 用法,帮助开发者灵活应用任务调度技术。
一、Cron 表达式基础概览
Cron 表达式的语法规则如下:
Spring Cron 表达式格式
秒 分 时 日 月 星期 [年(可选)]
- 支持秒字段:可以精确到秒的调度。
- 可选年字段:第 7 个字段为年份,非必需。
Linux Crontab 表达式格式
分 时 日 月 星期
- 从分钟字段开始:不支持秒字段。
- 无年份字段:仅支持描述到星期。
1. 示例对比
Spring Cron
| 表达式 | 描述 |
|---|---|
0 0 12 * * ? | 每天中午 12 点触发 |
0 0/15 9-17 * * ? | 每天上午 9 点到下午 5 点,每 15 分钟触发 |
Linux Crontab
| 表达式 | 描述 |
|---|---|
0 12 * * * | 每天中午 12 点触发 |
*/15 9-17 * * * | 每天上午 9 点到下午 5 点,每 15 分钟触发 |
二、Cron 表达式的高级用法:Spring 的强大特性
1. 特殊字符解析
| 字符 | 描述 | 示例 |
|---|---|---|
* | 匹配任意值 | 0 * 12 * * ? 每分钟触发 |
? | 不指定值(仅适用于日期和星期字段) | 0 0 12 ? * MON 每周一中午触发 |
/ | 递增触发 | 0/15 * * * * ? 每 15 秒触发 |
L | 表示“最后”(日期字段中表示最后一天,星期字段表示最后一个) | 0 0 12 L * ? 每月最后一天中午触发 |
W | 表示最近的工作日 | 0 0 9 15W * ? 每月 15 日最近的工作日上午 9 点触发 |
# | 表示第几个星期几 | 0 0 10 ? * 2#1 每月第一个星期一上午 10 点触发 |
2. 实战示例
示例 1:每月最后一天午夜执行
0 0 0 L * ?
- 描述:每月最后一天的 00:00 执行。
示例 2:每月最后一个星期五的晚上 8 点执行
0 0 20 ? * 6L
- 描述:每月最后一个星期五的 20:00 执行。
示例 3:每月最近的工作日的上午 9 点执行
0 0 9 LW * ?
- 描述:如果最后一天是周末,则调整到最近的工作日。
示例 4:每月的第一个星期一上午 10 点执行
0 0 10 ? * 2#1
- 描述:每月的第一个星期一上午 10:00 执行。
三、Linux Crontab 高级用法及与 Spring 的对比
Linux Crontab 不支持 L、W、# 等高级特性,但可以通过 Shell 脚本 实现类似功能。
1. 常见用法
| 表达式 | 描述 |
|---|---|
0 12 * * * | 每天中午 12 点触发 |
*/15 9-17 * * * | 每天上午 9 点到下午 5 点,每 15 分钟触发 |
0 0 28-31 * * | 每月最后一天(需要结合脚本判断) |
2. 脚本实现高级特性
每月最后一天触发
0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/command
说明:
- 检查明天的日期是否是 1 日,如果是,则今天是本月最后一天。
每月最后一个星期五触发
0 0 * * 5 [ "$(date +\%m -d '+7 days')" != "$(date +\%m)" ] && /path/to/command
说明:
- 检查下周是否进入新月份,如果是,则今天是本月最后一个星期五。
每月第一个星期一触发
0 10 * * 1 [ "$(date +\%d)" -le 7 ] && /path/to/command
说明:
- 检查当前日期是否小于等于 7 日,如果是,则今天是第一个星期一。
四、Spring Cron 与 Linux Crontab 的详细对比
| 特性 | Spring Cron | Linux Crontab |
|---|---|---|
| 字段数量 | 6 或 7 个字段(可选年字段) | 5 个字段 |
| 秒字段支持 | 支持 | 不支持 |
| 高级字符 | 支持 L, W, # | 不支持(需脚本实现) |
| 年字段支持 | 支持 | 不支持 |
| 日期与星期的结合 | 使用 ? 避免冲突 | 手动避免冲突 |
五、总结与最佳实践
通过本文,我们对比了 Spring Cron 和 Linux Crontab 的功能特点,并深入探讨了高级用法和实践技巧。
总结
-
Spring Cron:
- 支持高级特性,如
L(最后一天)、W(最近工作日)和#(第 N 个星期几)。 - 更加适合复杂任务调度。
- 支持高级特性,如
-
Linux Crontab:
- 通过简单表达式和脚本结合,可以完成大多数调度需求。
- 对于高频或简单任务,依然是首选方案。
-
选择建议:
- 对于微服务或复杂任务系统,推荐使用 Spring Cron 表达式。
- 对于轻量级系统和脚本驱动的任务,Linux Crontab 是最佳选择。
无论是 Spring Cron 还是 Linux Crontab,理解 Cron 表达式的规则和应用场景是高效完成任务调度的基础。如果你有更复杂的需求或疑问,欢迎留言交流!
相关文章:
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践20241120
深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践 任务调度是后台服务中的重要组成部分,无论是定期数据备份、日志归档还是周期性报表生成,Cron 表达式始终是描述这些任务规则的核心工具。本文将聚焦 Spring Cron 表…...
24软专 数据结构
1、A[n],k,将数组向右循环移动k位。要求时间复杂度O(n),空间O(1)。 思路:采用三次反转数组的操作,可以实现时间复杂度为O(n),空间复杂度为O(1)的算法。 void moveElem(int array[],int k,int length){//a…...
洛谷 P1616 疯狂的采药 C语言 记忆化搜索
题目: https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题,最后一个超出空间了。完全背包和就是无限次的拿,公式跟01背包差不多。 但是,只有当前能拿和拿不下,换下一个。注意要处理好边界条件。…...
#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
element-plus入门教程:Button
一、Button组件概述 Element Plus的Button组件是一个常用的操作按钮,提供了多种类型、尺寸、状态等配置选项,以满足不同的交互需求。 二、安装Element Plus 在Vue 3项目中,可以通过npm或yarn来安装Element Plus。 npm install element-pl…...
oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist
oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程: OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…...
flux的版本
1.flux1-dev.safetensors https://huggingface.co/black-forest-labs/FLUX.1-devhttps://huggingface.co/black-forest-labs/FLUX.1-dev原生的23.8G的模型。原生12B的模型,float16的。需要配合ae.safetensors,flux1-dev.safetensors以及clip-l和T5的权重使用,注意ae.sft和f…...
Kafka 数据倾斜:原因、影响与解决方案
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
【从零开始的LeetCode-算法】3297. 统计重新排列后包含另一个字符串的子字符串数目 I
给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后,word2 是重排字符串的 前缀,那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串的数目。 示例 1: 输入:word1 "bcca", word2 "…...
【2024APMCM亚太赛A题】完整参考论文与代码分享
A题 一、问题重述二、问题分析问题一:水下图像分类问题二:退化原因建模问题三:针对单一退化的图像增强方法问题四:复杂场景的综合增强模型问题五:针对性增强与综合增强的比较 三、问题假设退化特征独立性假设物理模型普…...
Excel求和如何过滤错误值
一、问题的提出 平时,我们在使用Excel时,最常用的功能就是求和了,一说到求和你可能想到用sum函数,但是如果sum的求和区域有#value #Div等错误值怎么办?如下图,记算C列中工资的总和。 直接用肯定会报错&…...
Android 常用命令和工具解析之GPU相关
目录 1、GPU基本信息 1.1 获取GPU基本信息 1.2 伪造GPU基本信息 2、GPU内存信息 3、经典案例 案例1:GPU伪造信息方案 案例2:GPU内存统计算法 GPU 指的是 Graphics Processing Unit,即图形处理单元。GPU 是一种专门用于处理图形和图像相…...
刷题——【模板】二维前缀和
前缀和 题目题目链接题解方法一方法二 题目 描述 给你一个 n 行 m 列的矩阵 A ,下标从1开始。 接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2 请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和, 输入描述&#x…...
Xilinx 7 系列 FPGA的各引脚外围电路接法
Xilinx 7系列FPGA的外围电路接法涉及到多个方面,包括电源引脚、时钟输入引脚、FPGA配置引脚、JTAG调试引脚,以及其他辅助引脚。 本文参考资料: ds180 - 7 Series FPGAs Data Sheet - Overview ds181 - Artix 7 FPGAs Data Sheet - DC and AC…...
Python 爬虫 (1)基础 | 目标网站
一、目标网站 1、加密网站 1.1、关键字比较明确 企名片:https://wx.qmpsee.com/articleDetail?idfeef62bfdac45a94b9cd89aed5c235be 1.2、关键字比较泛 烯牛数据:https://www.xiniudata.com/project/event/lib/invest...
数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)
###LAB 20 Engineering Change Orders (ECO) 这个章节的学习目标是学习数字IC后端实现innovus中的一种做function eco的flow。对于初学者,如果前面的lab还没掌握好的,可以直接跳过这节内容。有时间的同学,可以熟悉掌握下这个flow。 数字后端…...
量子卷积神经网络
量子神经网络由量子卷积层、量子池化层和量子全连接层组成 量子卷积层和量子池化层交替放置,分别实现特征提取和特征降维,之后通过量子全连接层进行特征综合 量子卷积层、量子池化层和量子全连接层分别由量子卷积单元、量子池化单元和量子全连接单元组…...
储能电站构成及控制原理
系列文章目录 能量管理系统(EMS)储能充放电策略 文章目录 系列文章目录一、储能电站构成二、储能系统关键部件及作用1.电池储能系统2.功率变换系统(Power Conversion System,PCS)3.变配电系统4.后台监控系统5.继电保护及安全自动装置 三、储能电站的功能四、储能电站控制策略 …...
Rocky Linux 系统安装/部署 Docker
1、下载docker-ce的repo文件 [rootlocalhost ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo % Total % Received % Xferd Average Speed Time Time Time Current Dloa…...
12 —— Webpack中向前端注入环境变量
需求:开发模式下打印语句生效,生产模式下打印语句失效 使用Webpack内置的DefinePlugin插件 const webpack require(webpack) module.exports { plugins: [ new webpack.DefinePlugin({ process.env.NODE_ENV:JSON.stringify(process.env.NODE_ENV) }…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
