Java Spring Boot:@使用Cron定义调度将在应用程序启动后直接触发

Java Spring Boot:@使用Cron定义调度将在应用程序启动后直接触发,java,spring,spring-boot,spring-scheduled,Java,Spring,Spring Boot,Spring Scheduled,我希望“0*/2***?”的@Scheduled注释中的cron表达式正好每2分钟(±几毫秒)运行一次。事实上,@Scheduled语句在Spring自动连线完成后直接在应用程序启动时运行一次。如何将Spring配置为在应用程序启动后不运行@Scheduled。作为解决方法,我使用了一个布尔值私有布尔值isInit=true,但让Spring做得不对是很尴尬的 我使用的是SpringBoot:2.2.4-RELEASE 附录: 问题不是每两分钟运行一次任务。这是关于如何让SpringBoot精确

我希望
“0*/2***?”
@Scheduled
注释中的cron表达式正好每2分钟(±几毫秒)运行一次。事实上,
@Scheduled
语句在Spring自动连线完成后直接在应用程序启动时运行一次。如何将Spring配置为在应用程序启动后不运行
@Scheduled
。作为解决方法,我使用了一个布尔值
私有布尔值isInit=true,但让Spring做得不对是很尴尬的

我使用的是SpringBoot:2.2.4-RELEASE

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

代码段:

@组件
公共类测试调度器{
私有最终记录器Logger=LoggerFactory.getLogger(this.getClass());
@已计划(cron=“0*/2***?”)
公开募捐{
logger.info(“TestScheduler运行”);
}
}
日志输出:

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
已解决:

这是代码中的一个错误,因为methode
@Autowired//private Config和这行与
@Scheduled
之间的大量注释我忽略了这个错误。
@Autowired
导致在连接过程中调用该方法

多亏了卢乔治

结果代码:

@组件
公共类测试调度器{
私有最终记录器Logger=LoggerFactory.getLogger(this.getClass());
@自动连线//私有配置;
@已计划(cron=“0*/2***?”)
公开募捐{
logger.info(“TestScheduler运行”);
}
}

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

 @Scheduled(fixedDelay = 120000, initialDelay = 3000)

不再允许:
@Scheduled(cron=“0*/2***?”,initialDelay=3000)
---异常:
bean初始化失败;嵌套异常为java.lang.IllegalStateException:遇到无效的@Scheduled方法“run”:“initialDelay”不支持cron触发器
Ahh不能将cron与delay混合使用。。。我已经更新了我的答案。这有帮助吗?不幸的是,语句应该按照cron计划运行。这是一个最小的例子。在实际代码中,cron语句是complexer,从外部vi应用程序注入Spring。ymlth这可能会有所帮助,这不是每2分钟安排一次,而是从0开始每2分钟安排一次。如果您想每2分钟安排一次,请使用
fixedDelay
。我似乎无法重现您的问题,即使复制您的代码。我的任务每2分钟“精确”运行一次。我使用的是spring boot 2.2.4。-发布。您使用什么版本?@lugiorgi 2.2.4-RELEASE。搜索计划的第一次执行,如果它在时间上或在应用程序启动后运行。@注意jj对我来说它是及时的,例如在20:04:00.000、20:06:00.000等。启动时没有额外的执行。您确定调度程序调用了该方法吗?在日志输出中,第一次执行在与其他线程不同的线程中运行。该线程不是scheduling-x,而是restartedMain。这表示您正在使用spring开发工具。也许这是个问题?