@Scheduled(cron = "0 20 3 * * *")
public void pageViewTask() {
// todo
}
项目里使用 @Scheduled注解实现定时任务,设置的是每天凌晨3点20执行一次,但是我本地启动服务发现每天定时任务在14:30就执行了,这个是什么原因。
使用的是springboot3.1.11
@Scheduled(cron = "0 20 3 * * *")
public void pageViewTask() {
// todo
}
项目里使用 @Scheduled注解实现定时任务,设置的是每天凌晨3点20执行一次,但是我本地启动服务发现每天定时任务在14:30就执行了,这个是什么原因。
使用的是springboot3.1.11
答案:
您提供的cron表达式 "0 20 3 * * *"
是有问题的,因为它不符合标准的cron表达式格式。Spring Framework中使用的cron表达式通常由6或7个字段组成,分别代表秒、分、小时、日期、月份、星期中的某一天(可选的年字段)。然而,您提供的表达式中多了一个星号(*),这很可能是导致任务执行时间不正确的原因。
对于每天凌晨3点20分执行一次的任务,正确的cron表达式应该是 "0 20 3 * * ?"
(注意最后一个问号,它代表没有指定年份,这是Spring中cron表达式的标准写法)。
因此,请尝试将您的代码修改为:
@Scheduled(cron = "0 20 3 * * ?")
public void pageViewTask() {
// 定时任务逻辑
}
此外,确保您的Spring Boot应用程序正确配置了定时任务,并且没有任何其他配置可能影响到定时任务的执行。如果问题依旧存在,请检查您的系统时区设置,因为定时任务的执行时间是基于系统时区的。如果您的系统时区设置不正确,那么定时任务的执行时间也会相应地偏移。
最后,请确保您的Spring Boot版本支持您使用的cron表达式格式。虽然Spring Boot 3.1.11应该支持上述的cron表达式格式,但最好还是查看官方文档以确认。
8 回答6.5k 阅读
2 回答4.1k 阅读✓ 已解决
4 回答4.2k 阅读
3 回答3.8k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
7 回答1.8k 阅读
估计是时区问题,可以看一下你的服务器时区是不是CST+8(Asia/Shanghai)/GMT+8/UTC+8,这些都是符合平常意义上的北京时间(东八区),有偏差大概率是时区不是北京时间的:
如果不想受系统时区影响,可以在注解里加上指定时区:
同时注意一下你的Cron表达式,最后一位星期几在你第四位第几日已经指定了为*(每一日)的情况下要避免冲突,所以使用?问号,同理如果你指定了最后一位星期几的话,第四位第几日也要使用?问号