Spring Boot在预定方法上过早唤醒



我发现Spring Boot 3有一个奇怪的行为。在@Scheduled方法中,我需要每隔10秒(0,10,20等)获取当前时间,但有时它似乎被提前了几纳秒触发,因此"秒"。不像预期的那样。代码示例

@Scheduled(cron = "0/10 * * * * *")
public void job() {
LocalDateTime now = LocalDateTime.now();
log.info(":: {} :: {}", now, now.truncatedTo(ChronoUnit.SECONDS));
}

这是我得到的:

2022-12-30T14:12:10.012+01:00  INFO 14896 --- [   scheduling-1] com.example.demo301.Job                  : :: 2022-12-30T14:12:10.012881700 :: 2022-12-30T14:12:10
2022-12-30T14:12:20.014+01:00  INFO 14896 --- [   scheduling-1] com.example.demo301.Job                  : :: 2022-12-30T14:12:20.014202300 :: 2022-12-30T14:12:20
**2022-12-30T14:12:29.999+01:00  INFO 14896 --- [   scheduling-1] com.example.demo301.Job                  : :: 2022-12-30T14:12:29.999757 :: 2022-12-30T14:12:29**
2022-12-30T14:12:40.005+01:00  INFO 14896 --- [   scheduling-1] com.example.demo301.Job                  : :: 2022-12-30T14:12:40.005453100 :: 2022-12-30T14:12:40
2022-12-30T14:12:50.012+01:00  INFO 14896 --- [   scheduling-1] com.example.demo301.Job                  : :: 2022-12-30T14:12:50.012125900 :: 2022-12-30T14:12:50

我已经从spring initializr中创建了一些maven项目,其中包含以下选项:

  • java version 19/17
  • 3.0.1/2.7.7jar

我让代码在openjdk-19的intelllij上运行1小时,并在spring boot 3(两个java版本)中发现了这个问题。我的原始环境是docker与openjdk的映像,它似乎发生得更频繁,但它可能只是随机的。我把它降到了2.7.7。在过去的几个月里(我每10秒保存一条记录),在另一个SO上使用docker (java 15)中的spring boot 2.7,同样的问题出现了几次,所以我没有注意到。

我想这是一个spring问题,由于注释,它是java/SO独立的。有人发现了同样的问题吗?我不希望修复代码,如增加1或2毫秒(可怕),但它看起来也不太好。

期待spring启动或java/openjdk修复。

也许我错误地认为Spring Boot是有罪的,但是在Spring框架上有一个关于这个问题的公开问题:https://github.com/spring-projects/spring-framework/issues/29735

最新更新