### Quartz Cron表达式详解
#### 一、CronTrigger与SimpleTrigger对比
在Quartz调度器中,`CronTrigger`是一种非常强大的触发机制,它能够根据复杂的日历规则来调度任务,相比于`SimpleTrigger`而言更为灵活。如果你的任务调度需要依据特定的日历概念而不是简单的时间间隔来进行,则`CronTrigger`将是一个更好的选择。
- **CronTrigger的应用场景**:
- 每周固定时间执行任务,比如“每星期五中午”。
- 工作日固定时间执行任务,例如“每个工作日9:30”。
- 定义更复杂的周期性任务,如“每5分钟一班,9:00和10:00逢星期一上午,星期三、星期五”。
- **CronTrigger的特性**:
- **开始时间**:指定触发器何时开始生效。
- **结束时间**:可选,指定触发器何时停止生效。
#### 二、CronExpression详解
Cron表达式是用于配置`CronTrigger`实例的一种字符串形式。这种字符串由七个子表达式组成,它们分别代表:
1. **Seconds(秒)**
2. **Minutes(分)**
3. **Hours(时)**
4. **Day-of-Month(月中的日)**
5. **Month(月)**
6. **Day-of-Week(周中的日)**
7. **Year(年)**(可选字段)
#### 三、Cron表达式的语法解析
Cron表达式的每个字段都有其特定的有效值及特殊字符。
- **字段名** | **允许的值** | **允许的特殊字符**
- Seconds(秒) | 0-59 | -,/*
- Minutes(分) | 0-59 | -,/*
- Hours(时) | 0-23 | -,/*
- Day-of-Month(月中的日) | 1-31 | -,*?/,LWC
- Month(月) | 1-12 or JAN-DEC | -,/*
- Day-of-Week(周中的日) | 1-7 or SUN-SAT | -,*?/,LC#
- Year(年)(可选字段) | empty,1970-2099 | -/*
- **特殊字符解释**:
- **“?”**:表示不确定的值。
- **“,”**:指定多个值。
- **“-”**:指定一个值的范围。
- **“/”**:指定一个值的增量,如`0/15`表示每隔15分钟执行一次。
- **“L”**:用于表示一个月的最后一天或一周中的最后一天,如`6L`表示“每月的最后一个星期五”。
- **“W”**:表示最近的工作日,如`15W`表示“最接近本月15日的工作日”。
- **“#”**:表示每月的第几个星期几,如`6#3`或`FRI#3`表示“每月的第三个星期五”。
#### 四、Cron表达式示例
以下是一些典型的Cron表达式示例:
- **每隔5秒执行一次**:`*/5 * * * * ?`
- **每隔1分钟执行一次**:`0 */1 * * * ?`
- **每天23点执行一次**:`0 23 * * * ?`
- **每天凌晨1点执行一次**:`0 1 * * * ?`
- **每月1号凌晨1点执行一次**:`0 1 1 * * ?`
- **每月最后一天23点执行一次**:`0 23 L * ?`
- **每周星期天凌晨1点执行一次**:`0 1 * * L ?`
- **在26分、29分、33分执行一次**:`0 26,29,33 * * * ?`
- **每天的0点、13点、18点、21点都执行一次**:`0 0,13,18,21 * * ?`
通过上述示例可以看出,Cron表达式具有极强的灵活性和扩展性,能够满足各种复杂的定时任务需求。理解和掌握Cron表达式的语法对于高效利用Quartz调度器至关重要。