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

yumo6663周前 (08-28)技术文章18

最近在测试服务器上发现定时任务执行的时候很奇怪,我定时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##定时任务#

相关文章

java定时器Timer 你还记得吗?_c#timer定时器的基本用法

java已经帮我们写了定时器的任务,我们只需要按照API的文档来实现就行。首先我们看下java帮我们实现的定时器类:java.lang.Timer我们先来看下Timer的构造方法:我们可以看到Time...

Java 底层大揭秘系列:如何实现定时任务

定时器已经是现代软件中不可缺少的一部分,例如每隔5秒去查询一下状态,是否有新邮件,实现一个闹钟等, Java 中已经有现成的 api 供使用,但是如果你想设计更高效,更精准的定时器任务,就需要了解底层...

java总结:8.正则表达式,匹配一天的指定时间段跑定时器

定时时间(每天早上3点到晚上23点,每5分钟执行):0 1/5 3-22 ? * * * 举例操作:定时器每20分钟执行一次,每天从3点执行,到5点结束 0 1/20 3-4 ? * * 执行的结...

面试突击34:如何使用线程池执行定时任务?

在 Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadSchedul...

JAVA架构师之路-教你如何去实现一个分布式定时任务

什么是分布式定时任务:首先,我们要了解计划任务这个概念,计划任务是指由计划的定时运行或者周期性运行的程序。我们最常见的就是Linux的‘crontab’和Windows的‘计划任务’。那么什么是分布式...

C# Timer详解_c# timers.timer

在C#编程中,Timer类是一个非常常用的工具,尤其适用于需要定期执行任务或者跟踪时间间隔的应用程序。C#中有三种不同的Timer类,它们分别位于不同的命名空间,且各有特点。下面将详细介绍这三种Tim...