一、基本概念
任务(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();
}
}
分享到:
相关推荐
`Spring Timer`是Spring框架提供的一个简单任务调度工具,它基于Java的`java.util.Timer`类。通过`@Scheduled`注解,开发者可以在Spring应用上下文中声明一个方法为定时任务。例如: ```java import org.spring...
总结来说,Spring的任务调度通过集成JDK的Timer或更高级的Quartz库,为开发者提供了灵活且强大的后台任务执行能力。无论是简单的定时任务还是复杂的调度需求,都能得到很好的满足。在设计和实现任务调度时,需要注意...
// 使用JDK的Timer调度任务 } } ``` ### 触发策略 在Spring中,你可以通过`Trigger`来决定任务何时触发。虽然Spring不直接支持`TimerTask`的触发,但可以自定义一个`Trigger`实现来模拟`TimerTask`的行为。 ```...
使用JDK定时器的基本步骤包括创建`Timer`对象,然后使用`schedule(TimerTask task, long delay)`或`schedule(TimerTask task, Date firstTime, long period)`方法来安排任务。`TimerTask`是可重用的异步任务,你需要...
总的来说,Spring 3.0的作业调度功能是其强大的自动化工具之一,它不仅提供了基本的定时任务执行,还通过新的API和机制,让开发者能够构建复杂、高效且可靠的调度解决方案。无论是在小型项目还是大型企业级应用中,...
总的来说,Spring的任务调度功能为开发者提供了强大的定时任务解决方案,无论是简单的JDK Timer还是复杂的Quartz,都能满足不同的需求。通过学习相关的源码和实践,我们可以更好地理解和利用这些工具,提升应用的...
在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年、月、日、时和分的时间。你只能将时间通过换算成微秒后传给它。如任务是每天执行一次,则需要在spring中如下...
在JDK 1.3及以后的版本中,`java.util.Timer`类提供了基础的定时任务支持。不过,`Timer`类的功能相对有限,无法精确地在特定时间点执行任务,比如设置每天特定时间执行的任务。 Quartz是一个强大且灵活的开源作业...
要将Timer集成到Spring中,可以通过`@Scheduled`注解定义任务,并在配置文件中启用定时任务调度。 4、在Spring中使用Quartz调度器 对于更复杂的排程需求,Spring支持与Quartz库集成。Quartz是一个强大且灵活的开源...
Spring 框架提供了对定时调度服务的内置支持类,支持从 JDK 1.3 开始内置的 Timer 类和 Quartz Scheduler。开发者可以通过 FactoryBean,分别指向 Timer 或 Trigger 实例的引用进行配置。同时,Spring 还包含有用于...
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。...Quartz在功能上远远超越了JDK自带的Timer,很好很强大!
Spring提供了多种任务调度方案,其中包括对JDK内置的Timer的支持以及与流行的任务调度库Quartz的集成。 任务调度简介: 在软件开发中,任务调度是用于自动化执行特定任务的重要机制。这些任务通常包括但不限于数据...
使用Timer的schedule()方法可以实现一次性调度。 4. 循环调度:循环调度是指在特定时间间隔执行任务。使用Timer的schedule()方法可以实现循环调度。 5. schedule()和scheduleAtFixedRate()的区别:schedule()方法...
它允许开发者在应用中安排周期性任务的执行,无需直接依赖底层的调度实现,如 Quartz 或者 JDK 的 Timer。接下来,我们将深入探讨Spring定时器的相关知识点。 一、Spring定时器基础 1. **TaskExecutor接口**:这是...
Spring框架提供了多种方式来实现定时任务,其中之一就是整合JDK自带的`TimerTask`。本文将详细介绍如何在Spring中使用`TimerTask`实现定时任务调度。 首先,`TimerTask`是Java标准库中的一个类,它实现了`Runnable`...
Timer类用于调度执行任务,而TimerTask类则是任务的抽象类。可以继承TimerTask类来实现自己的定时任务。 在示例代码中,我们定义了一个定时任务类TimmerTest,它继承了TimerTask类。在run方法中,我们输出当前时间...
2. `spring-context-support.jar`: 提供对任务调度的支持,包括 Quartz 和 JDK 的 Timer。 3. `spring-aop.jar`: 实现 AOP 功能,可以用来定义切面和通知,适用于事务管理等。 4. `quartz.jar`: Quartz 框架的核心库...
Spring Boot 支持多种任务调度框架,包括 JDK 内置的 Timer、ScheduledThreadPoolExecutor,以及更强大的 Spring Task 和 Quartz。每个框架都有其适用的场景: - Timer 和 ScheduledThreadPoolExecutor 更适合简单...
第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。 第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。 第15章:对...