`
learnworld
  • 浏览: 168325 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring任务调度方法之JDK Timer

阅读更多
一、基本概念
任务(job):需要被调度以指定的时间间隔运行的任务单元。
触发器(trigger):引发任务运行的条件。
调度计划(schedule):一个任务和用来管理这个任务的一组触发器的集合。
通常一个任务在他的调度计划中只有一个触发器,所以触发器和调度计划这两个概念通常可以互换。

二、spring的两种任务调度方法
1. JDK Timer JVM1.3版本后提供的任务调度能力,不需要依赖spring以外的产品。
优点:被包含在java中,不需要外部依赖库,当受限于程序大小或公司政策时可以使用。
不足:在定义一个调度计划时只能够提供有限的灵活性。
2. Quartz 提供很大的灵活性,允许定义类似于真实世界中的触发器。

三、JDK Timer
1)Timer触发器类型
一次性触发器(One-off)
重复固定延迟触发器(Fixed-Delay)
重复定时触发器(Fixed-Rated)
说明:
一次性触发器只能执行一次,执行完成后,不能被再度重新使用;
下面举例说明固定延迟触发器和定时触发器区别:
假如17:00开始任务执行,任务执行时间为30分钟,每小时执行一次,第一次运行将于17:30结束。如果采用固定延迟触发器,第二次运行将在18:30开始,计算方法为前一次结束时间加上间隔时间;如果采用定时触发器,第二次运行将在18:00开始,计算方法为前一次开始时间加上间隔时间。

2)JDK Timer的使用范例

package com.learnworld.timer;

import java.util.TimerTask;

public class HelloTask extends TimerTask {

	@Override
	public void run() {
		System.out.println("Hello!");
	}

}
package com.learnworld.timer;

import java.util.Calendar;
import java.util.Timer;

public class SchedulingTest {
	public static void main(String args[]){
	Timer t = new Timer();
	
	//一次性触发器,1000毫秒后开始运行
	t.schedule(new HelloTask(), 1000);
	
	//固定时间调用
	Calendar cal = Calendar.getInstance();
	cal.set(2010,Calendar.OCTOBER, 27);
	t.schedule(new HelloTask(), cal.getTime());

	//调用重复任务,固定延迟触发器
	t.schedule(new HelloTask(),1000,3000);
	
	//定时触发器
	t.scheduleAtFixedRate(new HelloTask(), 1000, 1000);

	}
}

3) Spring对JDK Timer调度的支持
目的:许多任务需要配置数据,采用spring管理,使得程序易于配置。
触发器信息是硬编码到程序里的,意味着对任务触发时间的修改都要修改程序并重新编译。
调度新任务或移除任务都需要修改程序代码,这可以通过spring来配置。

核心类:
ScheduleTimerTask: 扮演TimerTask的包装器实现,允许你为这个任务定义触发器信息。
TimerFactoryBean:让spring使用配置创建触发器,为一组指定的scheduledTimerTask bean自动创建Timer实例。

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="job" class="com.learnworld.timer.HelloTask" />
	<bean id="timerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay">
			<value>1000</value>
		</property>
		<property name="period">
			<value>3000</value>
		</property>
		<property name="timerTask">
			<ref local="job" />
		</property>
	</bean>

	<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
			<list>
				<ref local="timerTask" />
			</list>
		</property>
	</bean>
</beans>

package com.learnworld.timer;

import java.io.IOException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TimerFactoryBeanTest {
	public static void main(String[] args) throws IOException{
		ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/timer.xml");
		System.in.read();
	}
}


4)当进行任务调度时,通常需要执行一段现有逻辑,我们不需要创建一个包装你逻辑的TimerTask类,使用MethodInvokingTimerTaskFactoryBean,可以调度bean里任意方法或者指定类的静态方法。

配置文件methodInvoker.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="target" class="com.learnworld.timer.FooBean" />
	<bean id="job"
		class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
		<property name="targetObject">
			<ref local="target" />
		</property>
		<property name="targetMethod">
			<value>someJob</value>
		</property>
		<property name="arguments">
			<value>Hello!</value>
		</property>
	</bean>
	<bean id="timerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay">
			<value>1000</value>
		</property>
		<property name="period">
			<value>3000</value>
		</property>
		<property name="timerTask">
			<ref local="job" />
		</property>
	</bean>

	<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
			<list>
				<ref local="timerTask" />
			</list>
		</property>
	</bean>
</beans>


测试程序TimerMethodInvokerTest.java:

package com.learnworld.timer;

import java.io.IOException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TimerMethodInvokerTest {
		public static void main(String[] args) throws IOException{
			ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/methodInvoker.xml");
			System.in.read();
		}
}
分享到:
评论
6 楼 jameswxx 2010-10-29  
定时框架用什么倒无所谓,重要的在于对密集任务的调度和监控
5 楼 jessdy 2010-10-29  
3.0已经大大简化了Schedule,xml已经不需要了,只需要 @Scheduled就可以实现基本操作了
4 楼 learnworld 2010-10-28  
whitesock 写道
用ScheduledExecutorService,Timer已经没有使用价值了。

spring3.0中开始使用ScheduledExecutorService,前面的接口已经被淘汰了,不过新手上路,先从基础东西开始。
3 楼 whitesock 2010-10-28  
用ScheduledExecutorService,Timer已经没有使用价值了。
2 楼 满月无双 2010-10-28  
基础的我也不会哦,没做过任务调度方面的东西。了解多了总没坏处。
1 楼 zqding 2010-10-28  
很基础的东西,不过还是顶了...

相关推荐

    spring timer、quartz俩种任务调度

    实现了spring配置比较流行的任务调度操作,java timer 和 quartz俩种方式 并且有注释描述。

    spring中的任务调度器

    在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年、月、日、时和分的时间。你只能将时间通过换算成微秒后传给它。如任务是每天执行一次,则需要在spring中如下...

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。...Quartz在功能上远远超越了JDK自带的Timer,很好很强大!

    Spring+3.x企业应用开发实战光盘源码(全)

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:对...

    Spring.3.x企业应用开发实战(完整版).part2

    13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用...

    Spring3.x企业应用开发实战(完整版) part1

    13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用...

    Spring 2.0 开发参考手册

    2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1....

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    Spring中文帮助文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    Spring API

    2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1....

    Quartz_Job+Scheduling_Framework

    当初公司一个项目中有些定时候任务,原来是用 JDK 的 TaskTimer 来实现的,个人觉得比较笨拙--未能跳开节假日,也不能依 赖于其他的业务操作灵活安排计划。于是想起了 Spring 框架整合了一个作业调度框架 Quartz,...

    Quartz Job Scheduling Framework 中文版

    当初公司一个项目中有些定时候任务,原来是用 JDK 的 TaskTimer 来实现的,个人觉得比较笨拙--未能跳开节假日,也不能依赖于其他的业务操作灵活安排计划。于是想起了 Spring 框架整合了一个作业调度框架 Quartz,...

    javaSE代码实例

    16.4.3 线程同步调度的方法 362 16.4.4 “生产者-消费者”案例的框架 362 16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 ...

Global site tag (gtag.js) - Google Analytics