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