长跑春运预定任务

问题描述 投票:0回答:1

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

java spring scheduled-tasks
1个回答
0
投票

在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中,所有任务都将由线程执行(默认),为了减少任务之间的干扰,我们可以支持一个线程池来执行如下的shceduled任务:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.