本文目录导读:

我来详细说明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表达式的使用场景,可以根据实际需求选择合适的配置方式。