微前端架构如何改变企业的开发模式与效率提升
1234
2022-11-26
Spring定时任务无故停止又不报错的解决
目录Spring定时任务无故停止又不报错解决方案Spring定时任务跑完不再启动spring的定时任务有以下两个特性排查方式解决思路
Spring定时任务无故停止又不报错
一开始是使用Spring自带的定时器来配置定时任务的,简单快捷,配置如下:
但是使用一段时间之后就无故停止,且不报错,所以没有相关错误日志,需要重启Tomcat之后才能继续执行定时任务。
开始以为由于数据库最大连接数的限制,设置成翻倍了之后仍出现这问题。在同学的提醒下意识到可能是线程阻塞导致,于是网上查到原因:
Spring定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行。
解决方案
1.将JobDetail的concurrent属性配置为false。不允许任务并发执行。
2.任务执行时间较长时,查找根本问题。
于是把Spring自带的定时器改用Quartz,依赖相关包:
定时任务配置如下:
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
在startQuartz中用到SchedulerFactoryBeanWithShutdownDelay是因为当Tomcat被关闭时,有可能导致任务线程并未完全关闭,导致内存泄漏。
SchedulerFactoryBeanWithShutdownDelay.java
import org.quartz.SchedulerException;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
public class SchedulerFactoryBeanWithShutdownDelay extends SchedulerFactoryBean {
@Override
public void destroy() throws SchedulerException {
super.destroy();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
Spring定时任务跑完不再启动
spring的定时任务有以下两个特性
1、单定时任务之间是串行,之前的任务没执行完,下一个任务不会启动。
2、多个任务之间会相互干扰,其他同一时刻启动的任务没执行完,下一个任务不会启动。
排查方式
1、首先检查自己的代码,是否有死锁、卡住、bug、http请求没有设置超时时间等问题。
2、检查是否所有定时任务都不启动,如果是基本判断是特性2导致的,检查是哪个定时任务执行慢、卡住、出现bug等情况。
解决思路
1、修复bug,如果有的话。
2、如果就是有个任务执行慢,无法优化,可以不用spring的定时任务,改用Quartz。
依赖包
配置:
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~