当前位置: 首页 > 知识库问答 >
问题:

java - @Scheduled(cron = "0 20 3 * * *") 定时任务执行时间不对?

虞修平
2024-06-19
 @Scheduled(cron = "0 20 3 * * *")    public void pageViewTask() {     // todo}

项目里使用 @Scheduled注解实现定时任务,设置的是每天凌晨3点20执行一次,但是我本地启动服务发现每天定时任务在14:30就执行了,这个是什么原因。
使用的是springboot3.1.11

共有2个答案

那存
2024-06-19

估计是时区问题,可以看一下你的服务器时区是不是CST+8(Asia/Shanghai)/GMT+8/UTC+8,这些都是符合平常意义上的北京时间(东八区),有偏差大概率是时区不是北京时间的:

timedatectl

如果不想受系统时区影响,可以在注解里加上指定时区:

@Scheduled(cron = "0 20 3 * * ?",zone="Asia/Shanghai")    public void pageViewTask() {     // todo}

同时注意一下你的Cron表达式,最后一位星期几在你第四位第几日已经指定了为*(每一日)的情况下要避免冲突,所以使用?问号,同理如果你指定了最后一位星期几的话,第四位第几日也要使用?问号

东方弘壮
2024-06-19

答案

您提供的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表达式格式,但最好还是查看官方文档以确认。

 类似资料:
  • 本文向大家介绍SpringBoot执行定时任务@Scheduled的方法,包括了SpringBoot执行定时任务@Scheduled的方法的使用技巧和注意事项,需要的朋友参考一下 在做项目时,需要一个定时任务来接收数据存入数据库,后端再写一个接口来提供该该数据的最新的那一条。 数据保持最新:设计字段sign的值(0,1)来设定是否最新 定时任务插入数据:首先进行更新,将所有为1即新数据设置过期,然

  • 问题内容: 我一直在寻找有关如何实现功能的示例,该功能使您可以在Go中的特定时间执行任务,但是我什么也找不到。 我自己实现了自己,并在答案中分享了它,以便其他人可以为自己的实现提供参考。 问题答案: 这是一个常规实现,可让您设置: 间隔期 小时打勾 分钟打勾 tick秒 更新:( 内存泄漏已修复)

  • 我目前遇到一个问题,而使用@调度(cron)注释在Spring。 此任务每天凌晨3点(周一至周五)执行: 03:00:00278-03:00:08269 03:00:08269-03:00:15451 我的问题是,为什么这个任务执行两次?我已经说过,它应该只在分钟“0”和“0”秒运行,但这似乎是错的(请参阅执行时间)。我有两个这样的任务,都有这个问题。有没有人知道发生这种情况的原因以及如何避免?

  • 我试图在springboot上同时运行多个计划任务,但实际上它们运行队列(一个接一个,不是并行的) 这是我简单的服务: 输出: 但是,它应该是这样的: 我做错了什么? 这是我的配置:

  • 原文链接:Serverless 应用开发指南:CRON 定时执行 Lambda 任务 在上一篇文章《Serverless 应用开发指南:基于 Serverless 的 GitHub Webhook》里,我们介绍了如何用 Webhook 来触发定时的 Lambda 函数。这种方式与我们平时的 CI(持续集成)服务器相似,而CI(持续集成)服务器除了会监听 PUSH 事件。还会执行一些定时的任务,比如

  • 问题内容: 我这里有一个简单的测试方法,该方法设置为每5秒运行一次,但确实可以,但是查看System.out可以看到它似乎在做一些奇怪的事情。 输出: 为什么每次都运行TWICE (出现)? 问题答案: 该注释位于此链接的第25.5.1节下,内容如下: 确保不要在运行时初始化同一@Scheduled注释类的多个实例,除非你确实希望为每个此类实例计划回调。与此相关,请确保不要在使用@Schedule

  • 由来 Java中定时任务使用的最多的我想就是quartz了,但是这个框架太过庞大,而且我也不需要用到这么多东西,使用方法也是比较复杂(官方Demo我实在是无语……)。 用过Linux的crontab的人都知道,使用其定时的表达式可以非常灵活的定义定时任务的时间以及频率(Linux的crontab精确到分,而Quartz的精确到秒,不过对我来说精确到分已经够用了,精确到秒的可以使用Timer可以搞定

  • 本文向大家介绍Java定时任务:利用java Timer类实现定时执行任务的功能,包括了Java定时任务:利用java Timer类实现定时执行任务的功能的使用技巧和注意事项,需要的朋友参考一下 一、概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类。其中Timer是用来在一个后台线程按指定的计划来执行指定的任务。 TimerTask一个抽象类,它的子类代表