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

  • 相关阅读:
    软件概要设计
    Jmter进行Rabbitmq测试
    分布式锁
    实用异常
    异常集合
    本地Windows环境安装RabbitMQ Server
    MySQL千万级多表关联SQL语句调优
    mysql数据库多表关联查询的慢SQL优化
    rabbitmq详细配置
    Idea连接服务器docker并部署代码到docker实现一键启动
  • 原文地址:https://www.cnblogs.com/chyu/p/5323593.html
Copyright © 2011-2022 走看看