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

spring计划在错误的时间启动Cron作业

松安民
2023-03-14

我有一个spring boot应用程序,其中有各种使用@scheduled注释的调度程序。有些调度是使用fixedRate设置的,有些则使用cron。fixedRate调度运行良好,但我注意到,在过去的一个月中,cron调度fire的实际时间每天会有1-2个小时的变化。

即cron设置为

@Scheduled(cron = "0 0 2 * * *")

会在凌晨3点开火而不是凌晨2点。也不是每天都在发生。它会连续几天同时运行,然后发生一些事情,每次运行时它会关闭一个小时,直到我重新启动应用程序。

服务器上的系统时间是准确的,我完全没有主意了。以前有人遇到过这种情况吗?

编辑%1

我进行了一些日志记录,以确定作业是否在相同的时间间隔误发,结果似乎是随机的。下面是前面提到的cron作业在三天内的开始/结束时间:

Format: Calendar.getInstance().getTime() (System.currentTimeMillis())

Start: Sat Oct 21 03:14:15 CDT 2017 (1508573655778)
End:   Sat Oct 21 03:22:24 CDT 2017 (1508574144708)

Start: Sun Oct 22 02:26:58 CDT 2017 (1508657218774)
End:   Sun Oct 22 02:35:12 CDT 2017 (1508657712492)

Start: Mon Oct 23 02:00:03 CDT 2017 (1508742003072)
End:   Mon Oct 23 02:08:11 CDT 2017 (1508742491493)

共有2个答案

慕翰学
2023-03-14

它是每次发射正好1小时,还是像你提到的那样是可变的?您是如何测量它激发的时间的--使用日志记录?您正在注释的方法运行需要多长时间?在方法的开头和结尾记录一条消息,并比较那些时间戳。你可以试着用

private static final String CRON_SCHEDULE = "0 0 2 * * ?";
private static final String USER_TIMEZONE = "America/New_York";
// ...
@Scheduled(cron = CRON_SCHEDULE, zone = USER_TIMEZONE)
/* your method here */

以查看指定时区时的结果是否有任何不同。

袁泓
2023-03-14

终于想通了。我没有安装ThreadPoolTaskScheduler,因此没有足够大的线程池来运行所有排定的作业。

@Configuration
public class TaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(30);
        return threadPoolTaskScheduler;
    }

}
 类似资料:
  • 我希望每天早上9点完成一项任务。我得到了一些有趣的结果。目前我的工作是这样的: 这是怎么回事?这是正确的表达吗?

  • 我有一个spring boot应用程序,我需要每20秒刷新一次,所以我创建了这个: 它工作得很好,但当我向数据库中添加行时,在它为空之前,我想再次将计时器重置为20秒,有办法吗?

  • 我需要在Java中创建一个计划作业或Cron作业,以便每天早上6点运行。有没有一个简单的方法。我曾尝试将Timer类与scheduledAtFixedRate方法一起使用,但只需要一个延迟。 有一种方法可以将一天作为第一次,然后是第二次 如何创建启动计划程序的特定日期和时间? 我的类需要运行作业已经扩展了TimerWork。

  • 我在启动spring boot应用程序时遇到以下错误。这是我的第一个spring boot项目。因此,我不确定错误以及如何修复它。 申请启动失败 描述: 配置为侦听端口8080的Tomcat连接器无法启动。端口可能已在使用中,或者连接器可能配置错误。 行动: 验证连接器的配置,识别并停止在端口8080上侦听的任何进程,或者将此应用程序配置为在另一个端口上侦听。

  • 我想为我的应用程序安排cron作业来完成特定的任务。我如何在这个需求中安排? 要求:cron数据。js应每周一至周五每小时运行一次,时间为上午9:30至下午3:30。

  • 假设我想在2020年2月6日13:50运行一次作业。我该怎么做? 通过使用下面的表达式,我可以得出它将在今天13:50运行。但它明年也会运行。但我希望它只运行一次。