长期运行的春季计划任务

丹尼·弗里德:

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

TongChen :

在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;
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章