zoukankan      html  css  js  c++  java
  • spring中的定时调度实现TimerFactoryBean引起的隐患

    手中的一个老项目,其中使用的TimerFactoryBean实现的调度任务.一般都是spring quartz实现,这种的着实少见.正因为少见资料比较少,当初为了确认这个会不会2个调度任务同时并行执行,还特意看过源码,其中采用的jdk的Timer实现.也就是不会由于上一个任务没执行就启动下个任务的情况.

    这个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吧...

  • 相关阅读:
    day01_02.php的开发环境准备
    day01_01.了解php
    day05_01 鸡汤+内容回顾
    河北省科技信息通用调查系统需求-----------开发日志---第一天
    开发项目注意事项总结
    JavaScript学习心得
    掌握需求过程读后感
    自我检讨
    安卓开发使用get请求想服务器发送数据
    对安卓移动应用开发的学习
  • 原文地址:https://www.cnblogs.com/chyu/p/5323593.html
Copyright © 2011-2022 走看看