Spring 引导:带有 Cron 定义的@Scheduled将在应用程序启动后直接触发



我预计"0 */2 * * * ?"@Scheduled注解中的 cron 表达式将恰好每 2 分钟(±几毫秒(运行一次。事实上,在 Spring 自动布线完成后,@Scheduled语句直接在应用程序启动时运行一次。如何将 Spring 配置为在应用程序启动后不运行@Scheduled。作为解决方法,我使用了布尔private boolean isInit = true;,但是没有Spring做对是很尴尬的。

我正在使用 Spring 启动:2.2.4 发布

附录:问题不是每两分钟运行一次任务。这是关于如何让 Spring Boot 精确地按照 cron 语句中的定义运行计划。这只是显示效果的最小示例。

代码片段:

@Component
public class TestScheduler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(cron = "0 */2 * * * ?")
public void run() {
logger.info("TestScheduler run");
}
}

日志输出:

2020-02-04 17:27:45.553  INFO 25868 --- [  restartedMain] d.d.d.t.s.TestApplication                : Starting TestApplication [...]
[...]
2020-02-04 17:27:52.261  INFO 25868 --- [  restartedMain] d.d.d.t.s.runner.TestScheduler           : TestScheduler run
[...]
2020-02-04 17:28:00.002  INFO 25868 --- [   scheduling-1] d.d.d.t.s.runner.TestScheduler           : TestScheduler run
[...]
2020-02-04 17:30:00.002  INFO 25868 --- [   scheduling-1] d.d.d.t.s.runner.TestScheduler           : TestScheduler run

解决:

这是代码中的一个错误,因为方法@Autowired // private Config config;上方的这一行以及这一行和@Scheduled之间的很多注释我忽略了该错误。@Autowired导致在接线过程中调用该方法。

感谢卢乔吉

生成的代码:

@Component
public class TestScheduler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired // private Config config;
@Scheduled(cron = "0 */2 * * * ?")
public void run() {
logger.info("TestScheduler run");
}
}

您可以延迟计划的初始运行,并更改为每 2 分钟运行一次

@Scheduled(fixedDelay = 120000, initialDelay = 3000)

最新更新