Spring定时任务每天凌晨1:01执行的Cron表达式

Spring定时任务每天凌晨1:01执行的Cron表达式

技术背景

在Java开发中,Spring框架提供了强大的定时任务功能,通过Cron表达式可以方便地实现按固定时间执行任务。Cron表达式是一个字符串,由6个或7个字段组成,用于指定任务执行的时间规则。在某些场景下,我们可能需要让代码每天凌晨1:01执行,这就需要正确配置Cron表达式。

实现步骤

1. 确认Cron表达式格式

Cron表达式通常由6个字段表示:秒、分、时、日、月、周。例如,要实现每天凌晨1:01执行任务,有以下几种常见的正确Cron表达式:

  • 0 1 1 * * *
  • 0 1 1 * * ?

2. 在Spring项目中使用注解配置定时任务

在Spring项目中,可以使用@Scheduled注解来配置定时任务。以下是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

@Scheduled(cron = "0 1 1 * * *")
public void resetCache() {
// 这里编写需要定时执行的任务逻辑
System.out.println("定时任务在每天凌晨1:01执行");
}
}

3. 启用定时任务支持

在Spring Boot项目中,需要在主应用类上添加@EnableScheduling注解来启用定时任务支持。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

@Scheduled(cron = "0 1 1 * * *")
public void resetCache() {
// 这里编写需要定时执行的任务逻辑
System.out.println("定时任务在每天凌晨1:01执行");
}
}

最佳实践

考虑时区问题

为了确保定时任务在不同时区的服务器上都能按预期执行,建议在@Scheduled注解中指定时区。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

@Scheduled(cron = "0 1 1 * * *", zone = "Asia/Shanghai")
public void resetCache() {
// 这里编写需要定时执行的任务逻辑
System.out.println("定时任务在每天凌晨1:01执行");
}
}

执行多次任务

如果需要在一天内多个时间点执行任务,可以在Cron表达式中指定多个时间。例如,要在每天凌晨1:01和下午1:01执行任务,可以使用以下表达式:

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

@Scheduled(cron = "0 1 1,13 * * ?", zone = "Asia/Shanghai")
public void resetCache() {
// 这里编写需要定时执行的任务逻辑
System.out.println("定时任务执行");
}
}

常见问题

1. Cron表达式不生效

可能是因为没有在主应用类上添加@EnableScheduling注解,或者Cron表达式语法错误。可以检查注解是否添加,并使用在线Cron表达式验证工具验证表达式的正确性。

2. 时区问题导致任务执行时间不准确

需要在@Scheduled注解中明确指定时区,确保任务在正确的时间执行。

3. Spring不支持7个字段的Cron表达式

Spring的CronTrigger通常只支持6个字段的Cron表达式。如果使用了7个字段的表达式,可能会导致Spring不接受。可以尝试删除最后一个字段,大多数情况下问题可以解决。


Spring定时任务每天凌晨1:01执行的Cron表达式
https://119291.xyz/posts/2025-04-28.spring-cron-expression-for-101am-daily/
作者
ww
发布于
2025年4月28日
许可协议