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

时间: 2024-08-03 18:06:46

spring中的定时调度实现TimerFactoryBean引起的隐患的相关文章

Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

简介 Spring包含了对定时调度服务的内置支持类.当前,Spring支持从JDK1.3开始内置的Timer类和Quartz Scheduler(http://www.opensymphony.com/quartz/).二者都可以通过FactoryBean,分别指向Timer或Trigger实例的引用进行配置.更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingFactoryBean操作).Spring

spring 中配置定时调度两种方法介绍

方法一: 直接用jdk api的Timer类,无需配置spring文件 1.用@compent注解,实现InitializingBean接口 ,spirng会自动去查找afterPropertiesSet()方法, 2.在afterPropertiesSet方法中写业务实现,调用timer的schedule方法或者scheduleAtFixedRate方法 schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务. scheduleAtFixedRa

JAVA中的定时调度(Timer和TimerTask)

某些时候我们需要定时去完成一些任务,这里举一个例子:我们需要在3秒钟后打印当前系统时间,此后每隔5秒重复此操作.代码如下: import java.util.TimerTask; import java.util.Date; import java.util.Timer; import java.text.SimpleDateFormat; class ShowDateTask extends TimerTask { public void run() { SimpleDateFormat sd

Java中的定时调度

Timer类是一个线程设施,用于实现在某个时间或者某一段时间后安排某个任务执行一次或者定期重复执行.需要与TimerTask配合使用. TimerTask类用来实现由Timer安排的一次或重复执行的某次任务.是一个抽象类,子类必须覆写其中的run()方法,它引入接口Runnable得到的方法. 每个Timer对象对应一个线程. import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimerTask;

定时调度

JS中的定时调度 $(function(){ //一定要有这个 $("#clickButton").click(function(){ myfunction(); window.setInterval("myfunction()",3000);//注意:方法名要有双引号 }); }); function myfunction(){ alert("my firdt function !"); } 注意 : 方法名要有引号,双引号

Spring进阶-怎样集成定时调度Quartz

在一些项目里面比如进销存系统,对一些过期图片的定时清理或者库存不足发出预警提示,就需要用到定时调度技术. 每当经过一段时间,程序会自动执行,就是定时调度.如果要使用定时调度,则必须保证程序始终运行才行哦,也就是说定时调度是在程序之外又启动了一个新的线程.那么怎样才能实现定时调度呢? 方案一:可以使用JDK自带的java.util.Timer对象.可以创建定制的timer或者调用某些方法的timer.包装timer的工作由Spring TimerFactoryBean完成,不过这种方法不能准确设置

Spring整合quartz框架实现任务定时调度

1.  首先需要引入需要的jar包,如上图所示. 2. 编写需要定时调度的测试类: package com.jp.task; import java.util.Date; public class TestTask{ private static int counter = 0; protected void execute() { long ms = System.currentTimeMillis(); System.out.println("\t\t" + "=====

spring的定时调度

项目中要用到一个报表的运算服务器,项目一运行,就会启动相关的运算方法. 想了一圈,java web项目,spring是个万金油,什么都叫由它来管理.一查,还真有这个定时调度的功能. spring提供两种触发器,一个是CronTriggerBean,一个是SimpleTriggerBean. 好懒,长话短说吧. 环境: spring + ibatis,首先配置spring配置文件.写service层(具体的运算方法就写在这). 1). CronTriggerBea <!-- 定义job -->

通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载

前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的Scheduling模块.而原生的Scheduling模块只是内存态的调度模块,不支持任务的持久化或者配置(配置任务通过@Scheduled注解进行硬编码,不能抽离到类之外),因此考虑理解Scheduling模块的底层原理,并且基于此造一个简单的轮子,使之支持调度任务配置:通过配置文件或者JDBC数据