Spring定时任务无故停止又不报错
来源:互联网 发布:无需网络的游戏大全 编辑:程序博客网 时间:2024/04/28 04:53
一开始是使用Spring自带的定时器来配置定时任务的,简单快捷,配置如下:
<bean id="refreshCache" class="com.gionee.baserom.search.job.RefreshCache" /><task:scheduled-tasks> <task:scheduled ref="refreshCache" method="execute" cron="0 */30 * * * ?"/></task:scheduled-tasks>
但是使用一段时间之后就无故停止,且不报错,所以没有相关错误日志,需要重启Tomcat之后才能继续执行定时任务。
开始以为由于数据库最大连接数的限制,设置成翻倍了之后仍出现这问题。在同学的提醒下意识到可能是线程阻塞导致,于是网上查到原因:
Spring定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行。
解决方案:
1.将JobDetail的concurrent属性配置为false。不允许任务并发执行。
2.任务执行时间较长时,查找根本问题。
于是把Spring自带的定时器改用Quartz,依赖相关包:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version></dependency>
定时任务配置如下:
<!-- 工作的bean --> <bean id="myJob" class=" com.gionee.baserom.exchangerate.job.DailyTaskJob" /> <!-- 定义任务,为了避免线程阻塞,用concurrent=false --> <bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="myJob" /> <property name="targetMethod" value="execute" /> <property name="concurrent" value="false" /> </bean> <!-- 配置触发器 --> <bean id="myJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="myJobDetail" /> <property name="cronExpression" value="0 0/30 * * * ?" /> </bean> <!-- 配置调度器 --> <bean name="startQuertz" lazy-init="false" autowire="no" destroy-method="destroy" class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" > <property name="quartzProperties"> <props> <prop key="org.quartz.threadPool.threadCount">1</prop> </props> </property> <property name="waitForJobsToCompleteOnShutdown"> <value>false</value> </property> <property name="triggers"> <list> <ref bean="myJobTrigger" /> </list> </property> </bean>
在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); } } }
0 0
- Spring定时任务无故停止又不报错
- 定时循环停止任务
- Grunt 卡住不动,却又不报错
- Spring查表不报错
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring计划任务(定时任务)
- Spring MVC 定时任务报错
- Spring 定时任务功能
- Spring 定时任务实现
- spring执行定时任务
- spring执行定时任务
- spring中的定时任务
- spring多定时任务
- Spring+Quartz定时任务
- spring的定时任务
- 使用Linux shell(awk)读取pom.xml版本号
- Uart的自动流控制
- linux命令—网络通讯
- 浅谈oracle 内存结构(一) 系统全局区 SGA
- ceph系统原理 细节 benchmark 不完全说明
- Spring定时任务无故停止又不报错
- 在picocom中使用tftp操作文件
- 第二十三讲:二进制文件的操作与字符串流
- 展讯Android 默认音量修改
- J2EE的体系结构
- configure的参数记录
- php中字符串处理函数中最常用的6个
- 设计模式--工厂模式
- ArrayAdapter构造函数