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开发工具。也许这是个问题?