spring中的定时调度实现TimerFactoryBean引起的隐患
2016-03-26 17:47
615 查看
手中的一个老项目,其中使用的TimerFactoryBean实现的调度任务.一般都是spring quartz实现,这种的着实少见.正因为少见资料比较少,当初为了确认这个会不会2个调度任务同时并行执行,还特意看过源码,其中采用的jdk的Timer实现.也就是不会由于上一个任务没执行就启动下个任务的情况.
这个TimerFactoryBean通过引入ScheduledTimerTask来实现调度.大体的配置如下:
然后呢要是它一直稳定运行还好,可惜的是这个调度任务经常自己就挂掉了,消失了..第一印象是未捕获异常,导致程序出错退出,然后发现自定义代码MyTask中已经全段catch了.然后还考虑过线程死锁,排查过堆栈信息,折腾的好多次未果.
后来越来越觉得是这种实现本身有问题,然后对比spring的quartz实现做了测试,都抛出一个未捕获的异常,然后发现spring quartz可以继续执行下一次任务,而这个TimerFactoryBean已经挂掉了..由此推测这种实现的异常捕获做的不好,由于各种原因它本身产生异常后会直接导致整个调度任务死掉..
总结:TimerFactoryBean的实现有缺陷,所以调度任务还是使用spring的quartz吧...
这个TimerFactoryBean通过引入ScheduledTimerTask来实现调度.大体的配置如下:
<bean id="myTask" class="xx.xx.MyTask" > <bean id="scheduleTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="delay" value="10000" /> <property name="period" value="10000" /> <property name="timerTask"> <ref local="myTask" /> </property> </bean> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduleTask1" /> </list> </property> </bean>
然后呢要是它一直稳定运行还好,可惜的是这个调度任务经常自己就挂掉了,消失了..第一印象是未捕获异常,导致程序出错退出,然后发现自定义代码MyTask中已经全段catch了.然后还考虑过线程死锁,排查过堆栈信息,折腾的好多次未果.
后来越来越觉得是这种实现本身有问题,然后对比spring的quartz实现做了测试,都抛出一个未捕获的异常,然后发现spring quartz可以继续执行下一次任务,而这个TimerFactoryBean已经挂掉了..由此推测这种实现的异常捕获做的不好,由于各种原因它本身产生异常后会直接导致整个调度任务死掉..
总结:TimerFactoryBean的实现有缺陷,所以调度任务还是使用spring的quartz吧...
相关文章推荐
- java并发编程——ConcurrentHashMap(1.7)
- Java多线程之并发容器:CopyOnWrite到底干啥用的
- java并发编程—— 线程池原理 详解 ThreadPoolExecutor
- 用Spring MVC实现自定义404页面
- J2SE基础-构造方法总结
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- java并发编程—— 七 Thread理解与死锁分析(哲学家进餐演示)
- 20145240 《Java程序设计》第四周学习总结
- 解决eclipse中egit中的cannot open git-upload-pack问题
- MAC下安装多版本JDK和切换几种方式
- Java移位操作符
- Java关键字总结
- java如何操作字符串取得绝对路径中的文件名及文件夹名
- java io 流解析
- 匿名内部类
- Java-软引用、弱引用、虚引用、WeakHashMap
- 基于SpringMVC+hibernate-validator实现实现动态签名验证
- springside 推荐的编程
- [Java]path与classpath
- mac下搭建java开发环境:eclipse