首页 > 解决方案 > 基于 Spring Annotation 的调度程序,即“@Scheduled”没有按照 cron 表达式连续运行

问题描述

我使用了基于 Spring Annotation 的调度程序@Scheduler并将其设置为每 30 秒运行一次。我的示例代码是这样的。

这是一个使用调度器注解的示例服务代码。

 @Service
    public class SchedulerJob
    {
        @Scheduled(cron="*/30 * * * * ?")
        public void demoServiceMethod()
        {
            System.out.println("Job running every 30 seconds");
        }
    }

上面的代码工作正常,每 30 秒运行一次,但有时它没有运行。当我重新启动服务器时,它再次启动。

谁能用@Scheduler 注释告诉我这种行为的原因。

提前致谢。

标签: javaspringcronannotationsscheduler

解决方案


使用注解设置 Spring 配置 @EnableScheduling

@Configuration
@EnableScheduling
public class RootConfig { .. }

一个类似 cron 的表达式,扩展了通常的 UNIX 定义以包括秒以及分钟、小时、月中的某天、月和周中的某天的触发器。例如“0 * * * * MON-FRI”表示工作日每分钟一次。

cron有 60 秒的粒度,它不是最好的工具。如果你经常运行它,cron 不会达到亚分钟的分辨率,你将需要找到另一种方法。

尝试使用表达式initialDelayString定义在第一次执行之前延迟的毫秒数,并fixedDelayString在最后一次调用结束和下一次调用开始之间以毫秒为单位执行带注释的方法。

@Scheduled(initialDelayString = "${initialDelayString}", fixedDelayString = "${fixedDelayString}")
public void demoServiceMethod()

推荐阅读