我目前在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 中额外的启动器依赖项