Java cron表达式案例如何配置

wen java案例 26

本文目录导读:

Java cron表达式案例如何配置

  1. cron表达式基本格式
  2. 常用案例
  3. Spring Boot实战配置
  4. 特殊符号说明
  5. 注意事项

我来详细说明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 第一个星期二

注意事项

  1. 时区问题:cron默认使用服务器时区,可指定时区

    @Scheduled(cron = "0 0 8 * * ?", zone = "Asia/Shanghai")
  2. 避免冲突:任务时长不要超过间隔时间

  3. 异常处理:添加try-catch避免影响后续执行

  4. 日志记录:关键任务记录日志以便排查

@Scheduled(cron = "0 0/30 * * * ?")
public void scheduledMethod() {
    try {
        log.info("定时任务开始执行");
        // 业务逻辑
        log.info("定时任务执行成功");
    } catch (Exception e) {
        log.error("定时任务执行失败", e);
    }
}

这些案例涵盖了日常开发中大部分cron表达式的使用场景,可以根据实际需求选择合适的配置方式。

抱歉,评论功能暂时关闭!