Java Spring @Scheduled Cron 任务
Java Spring @Scheduled Cron Task
我目前在 Spring.
中使用 @Scheduled (cron) 注释时遇到问题
@Scheduled(cron = "0 0 3 * * MON-FRI", zone = "Europe/Berlin")
此任务每天凌晨3点执行(周一-周五):
- 03:00:00,278 - 03:00:08,269
- 03:00:08,269 - 03:00:15,451
我的问题是,为什么这个任务执行了两次?我已经声明它应该只 运行 在分钟“0”和“0”秒,但这似乎关闭(见执行时间)。
我有两个这样的任务,都有这个问题。有没有人知道发生这种情况的原因以及如何避免这种情况?
我正在使用 Spring 引导版本 2.1.6
。注意:即将升级到版本2.7
。
编辑:
我的调度程序class:
@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);
}
并删除 LdapTask
Class 中的 @Component
注释。
正如这个 post 的答案所暗示的那样,spring 实际上是在创建 ApplicationContext 的两个实例,它执行了这个方法两次。
初始化应用程序时仔细检查日志。
很有可能,您的调度程序被初始化了两次。
原因之一可能是从 SpringBootServletInitializer
扩展 - 它可能会为 WebApplicationContext 初始化 bean 一次,并为 Servlet 上下文再初始化一次。
source
P.S。为了给你解决方案,我需要访问整个 src 代码,因为它甚至可能是 pom
中的额外启动依赖项
我目前在 Spring.
中使用 @Scheduled (cron) 注释时遇到问题@Scheduled(cron = "0 0 3 * * MON-FRI", zone = "Europe/Berlin")
此任务每天凌晨3点执行(周一-周五):
- 03:00:00,278 - 03:00:08,269
- 03:00:08,269 - 03:00:15,451
我的问题是,为什么这个任务执行了两次?我已经声明它应该只 运行 在分钟“0”和“0”秒,但这似乎关闭(见执行时间)。 我有两个这样的任务,都有这个问题。有没有人知道发生这种情况的原因以及如何避免这种情况?
我正在使用 Spring 引导版本 2.1.6
。注意:即将升级到版本2.7
。
编辑:
我的调度程序class:
@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);
}
并删除 LdapTask
Class 中的 @Component
注释。
正如这个 post 的答案所暗示的那样,spring 实际上是在创建 ApplicationContext 的两个实例,它执行了这个方法两次。
初始化应用程序时仔细检查日志。
很有可能,您的调度程序被初始化了两次。
原因之一可能是从 SpringBootServletInitializer
扩展 - 它可能会为 WebApplicationContext 初始化 bean 一次,并为 Servlet 上下文再初始化一次。
source
P.S。为了给你解决方案,我需要访问整个 src 代码,因为它甚至可能是 pom
中的额外启动依赖项