Java Spring @Scheduled Cron 任务

Java Spring @Scheduled Cron Task

我目前在 Spring.

中使用 @Scheduled (cron) 注释时遇到问题

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

此任务每天凌晨3点执行(周一-周五):

我的问题是,为什么这个任务执行了两次?我已经声明它应该只 运行 在分钟“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

中的额外启动依赖项