Spring @Scheduled 定时任务,若任务过长,导致重叠怎么办?

譬如定时任务fixedRate是5秒,但是有时候任务执行超过5秒,接下来该任务的下一次执行怎么办?

或者cron是每分钟第5秒开始做一次任务,但是该任务超过1分钟,该任务的下一次执行怎么办?

假设在有定时线程池的情况下,会不会从线程池中取另一个线程来执行该任务的下一次执行,使得该任务的两次执行能并发进行?

其实这个问题从另一个角度来看,我们知道开启两个任务A和B可以有两种方式,一是放在同一个类里

       @Component
       Class Tasks{
           @Scheduled(cron="5 */1 * * * ?")
           public void ATask(){
              ...
           }
           
           @Scheduled(cron="5 */1 * * * ?")
           public void BTask(){
              ...
           }
       }
       

一种是放在两个不同类中

       @Component
       Class ATask{
           @Scheduled(cron="5 */1 * * * ?")
           public void Task(){
              ...
           }        
       }
       

       @Component
       Class BTask{
           @Scheduled(cron="5 */1 * * * ?")
           public void Task(){
              ...
           }        
       }

若有定时线程池,那么这A和B两个任务都可以并发进行吧?但是同一个任务的两次执行在时间上发生重叠的话,可以并法执行吗?

阅读 11.8k
2 个回答

不想重叠,分布式锁了解一下,Redis/hazelcast等,遇到了并发的,就直接跳过不执行后续的业务逻辑。

出现你说的这种问题,应该说是程序规划不合理,不管spring schedule采用哪种策略,都不能解决你的问题: 叠加新的任务线程,会造成任务堆积进而雪崩;或跳过后来的任务,造成漏执行,所以要看你自己的业务能接受哪种情况,合理规划间隔时间和超时时间.

初始化 SchedulerFactoryBean 下面参数与此有关:

PROP_THREAD_COUNT: 线程数, 设置这个参数,叠加也不会超过这个参数.

如果采用的是quartz定时任务的实现, 默认情况下并没有timeout机制, 可以采用
类似方式自己实现定时任务的超时.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题