长期运行的春季计划任务

时间:2018-12-18 13:22:40

标签: java spring scheduled-tasks

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

1 个答案:

答案 0 :(得分:1)

在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 ...

在春季,所有任务都将在线程上执行(默认),为了减少任务之间的干扰,我们可以支持线程池来执行如下任务:

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

关于春季计划任务的其他问题:Does spring @Scheduled annotated methods runs on different threads?