顾乔芝士网

持续更新的前后端开发技术栈

SpringBoot定时任务 @Scheduled 没有准时执行的原因及解决方案

最近在测试服务器上发现定时任务执行的时候很奇怪,我定时1个小时执行一次,有时候执行,有时候不执行,有时候间隔几个小时执行一次。

这是什么情况,明明在我本地测试的时候没有这些乱七八糟的问题啊!!!

在测试服务器查找一番才发现,测试服务器数据较多,运行的项目也比较多,我部署的项目里面有多个定时任务,每个定时任务执行的时间都不同。

SpringBoot 默认的定时任务是单线程的,就是说如果当前时间有一个定时任务在执行,那么下一个定时任务就要等待,等待上一个定时任务执行完成才会执行下一个定时任务。

如果定时任务排队时间过长,就有可能导致当前的定时任务和下次定时任务重叠,就有可能2次定时任务只执行一次,甚至有的时候就不执行了。

最终解决办法是用线程池。

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

@Configuration
public class ScheduledTaskConfiguration implements SchedulingConfigurer {

	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
		taskScheduler.setPoolSize(10);
		taskScheduler.initialize();
		taskRegistrar.setTaskScheduler(taskScheduler);
	}

}

在项目里面增加线程池的配置,理论上应该线程池就生效了。

其他可能的情况,以及测试情况请参考以下地址。

https://blog.51cto.com/u_14572091/5959161

我没有进行测试,我用了博主的方法,目前看我的问题是解决了。

下一步是把每个定时任务的执行时间记录下来,看看哪个定时任务执行的时间比较长~!

#java##springboot##定时任务#

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言