Java Spring @Scheduled Cron Task



我目前在Spring中使用@Scheduled(cron(注释时遇到了一个问题。

@Scheduled(cron = "0 0 3 * * MON-FRI", zone = "Europe/Berlin")

该任务每天凌晨3点(周一至周五(执行:

  • 03:00:00278-03:00:08269
  • 03:00:08269-03:00:15451

我的问题是,为什么这个任务执行两次?我已经说过,它应该只在"分钟"运行;0";以及";0";秒,但这似乎是关闭的(请参阅执行时间(。我有两项这样的任务,而且都有这个问题。有人知道发生这种情况的原因以及如何避免吗?

我使用的是Spring Boot版本2.1.6。注意:将很快升级到版本2.7

编辑:

我的调度程序类:

@Component
@RequiredArgsConstructor
@Log4j2
public class LdapTask {
private final IAppUserService appUserService;

private final IEmployeeService employeeService;

//second, minute, hour, day of month, month, day(s) of week
@Scheduled(cron = "0 0 3 * * MON-FRI", zone = "Europe/Berlin")
public void blockAppUsers() {
/* Logic here */
}

@Scheduled(cron = "0 20 3 * * MON-FRI")
public void checkEmailAddresses() {
/* Logic here */
}
}

应用程序(此应用程序的条目(:

@SpringBootApplication(exclude = MultipartAutoConfiguration.class)
@EntityScan(basePackages = "...")
@EnableScheduling
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

我的问题的答案:

我将SpringBootServletInitializer主体中重写的方法configure替换为:

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class, LdapTask.class);
}

而不是:

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}

以及移除CCD_ 7类中的CCD_。

正如这篇文章的答案所暗示的,spring实际上创建了ApplicationContext的两个实例,它执行了两次这个方法。

初始化应用程序时,请仔细检查日志。

很可能,您的调度程序已初始化两次。其中一个原因可能是从SpringBootServletInitializer扩展而来——它可能为WebApplicationContext初始化一次beans,为Servlet上下文初始化一次。

附言:为了给你解决方案,我需要访问整个src代码,因为它甚至可能是pom 中额外的启动器依赖项

最新更新