当前位置: 首页 > 知识库问答 >
问题:

Java Spring@定时Cron任务

叶允晨
2023-03-14

我目前遇到一个问题,而使用@调度(cron)注释在Spring。

@调度(cron="0 0 3**MON-FRI", zone="Europe/柏林")

此任务每天凌晨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);
}

并删除LdapTask类中的@Component注释。

正如这篇文章的答案所暗示的,Spring实际上是在创建Application Context的两个实例,它们执行了两次此方法。

共有1个答案

羊舌承
2023-03-14

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

最可能的情况是,您的调度程序已初始化两次。原因之一可能是从SpringBootServletInitializer扩展而来,它可以为WebApplicationContext初始化Bean一次,为Servlet上下文初始化一次。

来源

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

 类似资料:
  • 由来 Java中定时任务使用的最多的我想就是quartz了,但是这个框架太过庞大,而且我也不需要用到这么多东西,使用方法也是比较复杂(官方Demo我实在是无语……)。 用过Linux的crontab的人都知道,使用其定时的表达式可以非常灵活的定义定时任务的时间以及频率(Linux的crontab精确到分,而Quartz的精确到秒,不过对我来说精确到分已经够用了,精确到秒的可以使用Timer可以搞定

  • 问题内容: 我一直在寻找有关如何实现功能的示例,该功能使您可以在Go中的特定时间执行任务,但是我什么也找不到。 我自己实现了自己,并在答案中分享了它,以便其他人可以为自己的实现提供参考。 问题答案: 这是一个常规实现,可让您设置: 间隔期 小时打勾 分钟打勾 tick秒 更新:( 内存泄漏已修复)

  • 项目里使用 @Scheduled注解实现定时任务,设置的是每天凌晨3点20执行一次,但是我本地启动服务发现每天定时任务在14:30就执行了,这个是什么原因。 使用的是springboot3.1.11

  • 本文向大家介绍在WordPress中使用wp-cron插件来设置定时任务,包括了在WordPress中使用wp-cron插件来设置定时任务的使用技巧和注意事项,需要的朋友参考一下 PHP 本身是无法创建定时任务的,但是 WordPress 自带了一个伪定时任务(Cron) API,非常的方便好用,包括 WordPress 本身的定时发布文章都依赖于这个 API WP Cron 是什么? 是 Wor

  • 我必须执行简单的cron作业。例如,每天上午10点,我必须打开一个链接,然后链接做所有的工作。为此,我使用cron-job.org。 然而事情变得复杂了,我需要一个关于我应该如何进行的建议。 这个任务很简单,每天在某个时间,我必须执行这个作业(打开一个链接),但是这个时间是动态的,我从JSON数据中获取。 真正的问题是,我需要在每天00:00阅读一个json,其中包含作业在该特定日子必须执行的时间

  • 在请求返回后继续执行章节中,我们介绍了一种实现的方法,这里我们 介绍一种更优雅更通用的方法:ngx.timer.at()。 ngx.timer.at 会创建一个 Nginx timer。在事件循环中,Nginx 会找出到期的 timer,并在一个独立的协程中执行对应的 Lua 回调函数。 有了这种机制,ngx_lua 的功能得到了非常大的扩展,我们有机会做一些更有想象力的功能出来。比如 批量提交和