`
learnworld
  • 浏览: 169578 次
  • 性别: 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 Timer`是Spring框架提供的一个简单任务调度工具,它基于Java的`java.util.Timer`类。通过`@Scheduled`注解,开发者可以在Spring应用上下文中声明一个方法为定时任务。例如: ```java import org.spring...

    Spring 任务调度

    总结来说,Spring的任务调度通过集成JDK的Timer或更高级的Quartz库,为开发者提供了灵活且强大的后台任务执行能力。无论是简单的定时任务还是复杂的调度需求,都能得到很好的满足。在设计和实现任务调度时,需要注意...

    spring + jdk TimerTask定时器

    // 使用JDK的Timer调度任务 } } ``` ### 触发策略 在Spring中,你可以通过`Trigger`来决定任务何时触发。虽然Spring不直接支持`TimerTask`的触发,但可以自定义一个`Trigger`实现来模拟`TimerTask`的行为。 ```...

    spring+jdk定时器

    使用JDK定时器的基本步骤包括创建`Timer`对象,然后使用`schedule(TimerTask task, long delay)`或`schedule(TimerTask task, Date firstTime, long period)`方法来安排任务。`TimerTask`是可重用的异步任务,你需要...

    Spring3.0作业调度

    总的来说,Spring 3.0的作业调度功能是其强大的自动化工具之一,它不仅提供了基本的定时任务执行,还通过新的API和机制,让开发者能够构建复杂、高效且可靠的调度解决方案。无论是在小型项目还是大型企业级应用中,...

    spring2 计划任务

    总的来说,Spring的任务调度功能为开发者提供了强大的定时任务解决方案,无论是简单的JDK Timer还是复杂的Quartz,都能满足不同的需求。通过学习相关的源码和实践,我们可以更好地理解和利用这些工具,提升应用的...

    spring中的任务调度器

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

    Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)

    在JDK 1.3及以后的版本中,`java.util.Timer`类提供了基础的定时任务支持。不过,`Timer`类的功能相对有限,无法精确地在特定时间点执行任务,比如设置每天特定时间执行的任务。 Quartz是一个强大且灵活的开源作业...

    Spring排程(Scheduling)技术

    要将Timer集成到Spring中,可以通过`@Scheduled`注解定义任务,并在配置文件中启用定时任务调度。 4、在Spring中使用Quartz调度器 对于更复杂的排程需求,Spring支持与Quartz库集成。Quartz是一个强大且灵活的开源...

    spring 定时任务配置详解

    Spring 框架提供了对定时调度服务的内置支持类,支持从 JDK 1.3 开始内置的 Timer 类和 Quartz Scheduler。开发者可以通过 FactoryBean,分别指向 Timer 或 Trigger 实例的引用进行配置。同时,Spring 还包含有用于...

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

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

    spring定时计划讲义

    Spring提供了多种任务调度方案,其中包括对JDK内置的Timer的支持以及与流行的任务调度库Quartz的集成。 任务调度简介: 在软件开发中,任务调度是用于自动化执行特定任务的重要机制。这些任务通常包括但不限于数据...

    深入理解Java定时调度(Timer)机制

    使用Timer的schedule()方法可以实现一次性调度。 4. 循环调度:循环调度是指在特定时间间隔执行任务。使用Timer的schedule()方法可以实现循环调度。 5. schedule()和scheduleAtFixedRate()的区别:schedule()方法...

    spring定时器相关资料

    它允许开发者在应用中安排周期性任务的执行,无需直接依赖底层的调度实现,如 Quartz 或者 JDK 的 Timer。接下来,我们将深入探讨Spring定时器的相关知识点。 一、Spring定时器基础 1. **TaskExecutor接口**:这是...

    Spring整合TimerTask实现定时任务调度

    Spring框架提供了多种方式来实现定时任务,其中之一就是整合JDK自带的`TimerTask`。本文将详细介绍如何在Spring中使用`TimerTask`实现定时任务调度。 首先,`TimerTask`是Java标准库中的一个类,它实现了`Runnable`...

    Spring监听器及定时任务实现方法详解

    Timer类用于调度执行任务,而TimerTask类则是任务的抽象类。可以继承TimerTask类来实现自己的定时任务。 在示例代码中,我们定义了一个定时任务类TimmerTest,它继承了TimerTask类。在run方法中,我们输出当前时间...

    spring quartz相关jar包(多版本)

    2. `spring-context-support.jar`: 提供对任务调度的支持,包括 Quartz 和 JDK 的 Timer。 3. `spring-aop.jar`: 实现 AOP 功能,可以用来定义切面和通知,适用于事务管理等。 4. `quartz.jar`: Quartz 框架的核心库...

    SpringBoot官方支持任务调度框架,轻量级用起来也挺香!.doc

    Spring Boot 支持多种任务调度框架,包括 JDK 内置的 Timer、ScheduledThreadPoolExecutor,以及更强大的 Spring Task 和 Quartz。每个框架都有其适用的场景: - Timer 和 ScheduledThreadPoolExecutor 更适合简单...

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

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

Global site tag (gtag.js) - Google Analytics