首页 > 解决方案 > 长时间运行的春季计划任务

问题描述

我在 context.xml 文件中定义了一个 Spring 计划任务,它每分钟运行一次。该任务调用一个 postgres 存储过程。存储过程运行时间可以持续一分钟以上。如果当前运行未完成,spring 框架会调用相同的调度程序吗?谢谢,

标签: javaspringscheduled-tasks

解决方案


在spring框架中,一个定时任务只能由一个线程执行,如果执行时间长于间隔时间,任务就会被延迟。下面是一个简单的例子:

@Scheduled(cron = "0/3 * * * * *")
public void work() {
    log.info("begin to do some work,current thread is {}", Thread.currentThread().getName());
    try {
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        log.error(e.toString());
    }
}

我创建了一个计划任务,预期执行顺序:0 3 6 9 ...,但任务需要更多时间,所以执行顺序:0 6 12 18 ...

在spring中,所有任务都将由线程执行(默认),为了减少任务之间的干扰,我们可以支持一个线程池来执行这样的调度任务:

@Bean
public ThreadPoolTaskScheduler taskExecutor() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(20);
    return scheduler;
}

关于春季计划任务的其他问题:spring @Scheduled 注解的方法是否在不同的线程上运行?


推荐阅读