我预计"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)