本文目录导读:

我来详细说明Java中cron表达式的配置案例。
cron表达式基本格式
秒 分 时 日 月 周 [年(可选)]
字段说明: | 字段 | 取值范围 | 特殊字符 | |------|----------|----------| | 秒 | 0-59 | , - / | | 分 | 0-59 | , - / | | 时 | 0-23 | , - / | | 日 | 1-31 | , - ? / L W C | | 月 | 1-12或JAN-DEC | , - / | | 周 | 1-7或SUN-SAT | , - ? / L # C | | 年(可选)| 1970-2099 | , - * / |
常用案例
基础定时任务
// 每天中午12点执行
@Scheduled(cron = "0 0 12 * * ?")
public void dailyTask() {
System.out.println("每天中午12点执行");
}
// 每分钟执行一次
@Scheduled(cron = "0 * * * * ?")
public void perMinuteTask() {
System.out.println("每分钟执行一次");
}
// 每小时执行一次(整点)
@Scheduled(cron = "0 0 * * * ?")
public void perHourTask() {
System.out.println("每小时执行一次");
}
特定时间点执行
// 每天早上8:00执行
@Scheduled(cron = "0 0 8 * * ?")
public void morningTask() {
System.out.println("早上8点执行");
}
// 每天晚上22:30执行
@Scheduled(cron = "0 30 22 * * ?")
public void nightTask() {
System.out.println("晚上10点半执行");
}
// 每月1号凌晨2点执行
@Scheduled(cron = "0 0 2 1 * ?")
public void monthlyTask() {
System.out.println("每月1号凌晨2点执行");
}
间隔执行模式
// 每隔5分钟执行一次
@Scheduled(cron = "0 0/5 * * * ?")
public void every5Minutes() {
System.out.println("每5分钟执行一次");
}
// 每隔3小时执行一次
@Scheduled(cron = "0 0 0/3 * * ?")
public void every3Hours() {
System.out.println("每3小时执行一次");
}
// 从8:00开始,每隔2小时执行
@Scheduled(cron = "0 0 8/2 * * ?")
public void from8Every2Hours() {
System.out.println("从8点开始每2小时执行");
}
特定星期执行
// 每周一到周五上午9:30执行
@Scheduled(cron = "0 30 9 ? * MON-FRI")
public void weekdaysTask() {
System.out.println("工作日9:30执行");
}
// 每周六、周日10:00执行
@Scheduled(cron = "0 0 10 ? * SAT,SUN")
public void weekendTask() {
System.out.println("周末10:00执行");
}
// 每周一、三、五14:00执行
@Scheduled(cron = "0 0 14 ? * MON,WED,FRI")
public void specificWeekdays() {
System.out.println("周一、三、五14:00执行");
}
组合条件
// 每月的最后一天23:00执行
@Scheduled(cron = "0 0 23 L * ?")
public void lastDayOfMonth() {
System.out.println("每月最后一天23点执行");
}
// 每周日23:59执行
@Scheduled(cron = "59 59 23 ? * SUN")
public void sundayNight() {
System.out.println("每周日23:59执行");
}
// 每季度第一天的0点执行
@Scheduled(cron = "0 0 0 1 1,4,7,10 ?")
public void quarterTask() {
System.out.println("每季度第一天执行");
}
Spring Boot实战配置
启用定时任务
@SpringBootApplication
@EnableScheduling // 启用定时任务
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
完整示例
@Component
public class ScheduledTasks {
// 每秒打印当前时间
@Scheduled(cron = "0/1 * * * * ?")
public void printTime() {
System.out.println("当前时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()));
}
// 任务配置
@Scheduled(cron = "${task.cron.expression}") // 从配置文件读取
public void configurableTask() {
System.out.println("可配置的定时任务");
}
// 固定延迟执行(上一次执行完后延迟固定时间)
@Scheduled(fixedDelay = 5000) // 5秒后执行
public void fixedDelayTask() throws InterruptedException {
System.out.println("固定延迟任务开始");
Thread.sleep(2000); // 模拟耗时
System.out.println("固定延迟任务结束");
}
// 固定频率执行
@Scheduled(fixedRate = 10000) // 每10秒执行一次
public void fixedRateTask() {
System.out.println("固定频率任务");
}
}
配置文件方式
# application.yml
task:
cron:
expression: "0 0 2 * * ?" # 每天凌晨2点执行
email: "0 0 9 * * MON-FRI" # 工作日9点发邮件
backup: "0 0 1 1 * ?" # 每月1号凌晨1点备份
@Component
public class DynamicScheduleTask {
@Value("${task.cron.expression}")
private String cronExpression;
@Scheduled(cron = "#{@dynamicCronExpression}")
public void dynamicTask() {
System.out.println("动态定时任务执行");
}
}
特殊符号说明
| 符号 | 含义 | 示例 |
|---|---|---|
| 所有值 | 每秒执行 | |
| 无特定值 | 通常在日和星期字段互斥使用 | |
| 范围 | 10-15 表示10到15 |
|
| 增量 | 0/5 表示从0开始每5 |
|
| 列举 | MON,WED,FRI 周一、三、五 |
|
| L | 最后 | L 最后一天或最后一周 |
| W | 工作日 | 15W 15号最近的工作日 |
| 第几个 | 2#1 第一个星期二 |
注意事项
-
时区问题:cron默认使用服务器时区,可指定时区
@Scheduled(cron = "0 0 8 * * ?", zone = "Asia/Shanghai")
-
避免冲突:任务时长不要超过间隔时间
-
异常处理:添加try-catch避免影响后续执行
-
日志记录:关键任务记录日志以便排查
@Scheduled(cron = "0 0/30 * * * ?")
public void scheduledMethod() {
try {
log.info("定时任务开始执行");
// 业务逻辑
log.info("定时任务执行成功");
} catch (Exception e) {
log.error("定时任务执行失败", e);
}
}
这些案例涵盖了日常开发中大部分cron表达式的使用场景,可以根据实际需求选择合适的配置方式。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播