基础入门
# 定时任务基础入门
# cron 表达式
# 格式
cron 表达式是一种用于配置定时任务(计划任务)的字符串,它由六个或七个字段组成,表示时间表,格式如下:
// 秒 分 时 日 月 星期 年
* * * * * * ?
1
2
2
# 字段含义
每个字段由一个星号(*
)或具体值组成,字段之间用空格分隔。以下是每个字段的含义:
秒(0 - 59):
- 任务执行的秒数,可以是单个数字,范围列表,或特殊字符。
分(0 - 59):
- 任务执行的分钟数。
小时(0 - 23):
- 任务执行的小时数。
日期(1 - 31):
- 任务执行的月份中的日期。
月份(1 - 12 或 JAN-DEC):
- 任务执行的月份。
星期几(0 - 7 或 SUN-SAT):
- 任务执行的星期几,0 或 7 表示星期日。
年份(可选字段):
- 如果需要指定年份,可以在表达式的末尾添加年份字段。
# 特殊字符
特殊字符包括:
- 星号(
*
): 表示匹配任意值。例如,* 在分钟字段中表示每分钟都执行。 - 问号(
?
): 表示不指定值,通常用在日期
和星期几
字段,通常用于避免冲突。 - 连字符(
-
): 表示一个范围,例如10-12
表示从 10 到 12。 - 斜线(
/
): 表示起始时间开始,每隔一定的间隔执行,例如0/30
表示每 30 分钟。 - 逗号(
,
):用于分隔多个值。例如,1,3,5 在小时字段中表示 1 点、3 点和 5 点执行。 L
: 表示 “Last” 最后,例如在日期字段表示一个月的最后一天。只能出现在 【日期】和 【星期】域。W
: 表示有效工作日(周一到周五),只能出现在【日期】域。LW
: 这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。#
: 用于确定每个月第几个星期几,只能出现在【星期】域。例如在4#2
,表示某月的第二个星期三。
以下是一些具体的例子:
0 * * * * ?
: 每分钟执行一次。0 0/30 * * * ?
: 每 30 分钟执行。0 0 * * * ?
:整点执行。0 0-59/2 * * * ?
: 每小时的第 2 分钟开始,每 2 分钟执行一次。0 8,14 * * * ?
: 每天的上午 8 点和下午 2 点执行。0 0/5 14 * * ?
: 在下午 2 点到 3 点之间,每 5 分钟执行一次。0 0 9-17 * * ?
: 从上午 9 点到下午 5 点,每小时的整点执行。0 15 10 L \* ?
:每月最后一日的上午 10:15 执行。0 15 10 ? * 6#3
: 每月的第三个星期五上午 10:15 执行。
# 小结
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒(Seconds) | 0~59 的整数 | , - * / 四个字符 |
分(Minutes) | 0~59 的整数 | , - * / 四个字符 |
小时(Hours) | 0~23 的整数 | , - * / 四个字符 |
日期(DayOfMonth) | 1~31 的整数(但是你需要考虑你月的天数) | ,- * ? / L W C 八个字符 |
月份(Month) | 1~12 的整数或者 JAN-DEC | , - * / 四个字符 |
星期(DayOfWeek) | 1~7 的整数或者 SUN-SAT (1=SUN) | , - * ? / L C # 八个字符 |
年(可选,留空)(Year) | 1970~2099 | , - * / 四个字符 |
# 何为单机定时任务和分布式定时任务
单机定时任务和分布式定时任务是两种不同的任务调度方式,它们在计算机系统中用于自动执行预定的任务。下面是它们的基本定义和区别:
# 单机定时任务
- 定义:单机定时任务是指在单个计算机或服务器上运行的定时任务。这种任务通常由操作系统的调度器或特定的任务调度软件来管理。
- 特点:
- 单一资源:单机定时任务只能在一个节点上运行,因此它只能利用该节点的资源。如果任务量超出了这个节点的处理能力,就可能导致性能瓶颈或任务延迟。
- 串行处理:任务通常是串行执行的,这意味着它们一个接一个地运行,而不是同时进行。
- 简单性:管理和配置相对简单,因为所有任务都在同一个系统上运行。
- 局限性:如果任务量很大或需要高可用性,单机可能无法满足需求。
- 容错性较低:如果单机发生故障,所有任务都可能受到影响,因为没有其他节点可以接管任务。
# 分布式定时任务
- 定义:分布式定时任务是指在多个计算机或服务器上协调运行的定时任务。这种任务通常由分布式任务调度系统来管理,如 Apache Hadoop 的 Oozie、Apache Storm、Quartz 等。
- 特点:
- 扩展性:可以跨多个节点分布任务,提高系统的处理能力和容错性。
- 高可用性:通过在不同的节点上运行任务,可以减少单点故障的风险。
- 复杂性:管理和配置比单机定时任务更复杂,需要考虑任务的分配、节点间的通信和数据同步等问题。
- 负载均衡:可以根据节点的负载情况动态分配任务,优化资源使用。
- 容错性:如果某个节点发生故障,任务可以被重新分配到其他节点上执行,从而提高系统的稳定性和可靠性。
# 区别
- 多节点资源:分布式定时任务可以在多个节点(服务器或计算机)上运行,这意味着它可以利用这些节点上的所有资源,包括CPU、内存、存储和网络带宽等。
- 并行处理:任务可以在不同的节点上并行执行,从而提高处理速度和效率。
- 容错能力:分布式系统通常具有更好的容错能力,因为任务可以在其他节点上重新调度。
- 可扩展性:分布式系统更容易扩展,可以通过增加节点来处理更多的任务。
- 管理难度:分布式定时任务的管理和配置通常比单机定时任务更复杂。
# 多线程执行定时任务
- SpringBoot使用@Scheduled注解实现定时任务_springboot scheduled注解-CSDN博客 (opens new window)
- spring boot @Scheduled未生效原因以及相关坑、及相对其他定时任务架构的优势 - zhjh256 - 博客园 (cnblogs.com) (opens new window)
- 浅析SpringBoot中使用@scheduled定时执行任务需要注意的单线程的坑 - 古兰精 - 博客园 (cnblogs.com) (opens new window)
- @Scheduled 的一些坑_scheduledcron失效-CSDN博客 (opens new window)
# 在线表达式生成器
- Cron - 在线Cron表达式生成器 (ciding.cc) (opens new window)
- 在线Cron表达式生成器 - 码工具 (matools.com) (opens new window)
- 在线Cron表达式生成器 (qqe2.com) (opens new window)
- quartz/Cron/Crontab表达式在线生成工具-BeJSON.com (opens new window)
# 学习参考
上次更新: 2024/9/25 11:16:13