`
zxingchao2005
  • 浏览: 80502 次
  • 性别: 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的使用范例

  1. packagecom.learnworld.timer;
  2. importjava.util.TimerTask;
  3. publicclassHelloTaskextendsTimerTask{
  4. @Override
  5. publicvoidrun(){
  6. System.out.println("Hello!");
  7. }
  8. }

  1. packagecom.learnworld.timer;
  2. importjava.util.Calendar;
  3. importjava.util.Timer;
  4. publicclassSchedulingTest{
  5. publicstaticvoidmain(Stringargs[]){
  6. Timert=newTimer();
  7. //一次性触发器,1000毫秒后开始运行
  8. t.schedule(newHelloTask(),1000);
  9. //固定时间调用
  10. Calendarcal=Calendar.getInstance();
  11. cal.set(2010,Calendar.OCTOBER,27);
  12. t.schedule(newHelloTask(),cal.getTime());
  13. //调用重复任务,固定延迟触发器
  14. t.schedule(newHelloTask(),1000,3000);
  15. //定时触发器
  16. t.scheduleAtFixedRate(newHelloTask(),1000,1000);
  17. }
  18. }

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

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

配置文件:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4. <beanid="job"class="com.learnworld.timer.HelloTask"/>
  5. <beanid="timerTask"class="org.springframework.scheduling.timer.ScheduledTimerTask">
  6. <propertyname="delay">
  7. <value>1000</value>
  8. </property>
  9. <propertyname="period">
  10. <value>3000</value>
  11. </property>
  12. <propertyname="timerTask">
  13. <reflocal="job"/>
  14. </property>
  15. </bean>
  16. <beanid="timerFactory"class="org.springframework.scheduling.timer.TimerFactoryBean">
  17. <propertyname="scheduledTimerTasks">
  18. <list>
  19. <reflocal="timerTask"/>
  20. </list>
  21. </property>
  22. </bean>
  23. </beans>

  1. packagecom.learnworld.timer;
  2. importjava.io.IOException;
  3. importorg.springframework.context.ApplicationContext;
  4. importorg.springframework.context.support.FileSystemXmlApplicationContext;
  5. publicclassTimerFactoryBeanTest{
  6. publicstaticvoidmain(String[]args)throwsIOException{
  7. ApplicationContextac=newFileSystemXmlApplicationContext("src/conf/timer.xml");
  8. System.in.read();
  9. }
  10. }

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

配置文件methodInvoker.xml:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4. <beanid="target"class="com.learnworld.timer.FooBean"/>
  5. <beanid="job"
  6. class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
  7. <propertyname="targetObject">
  8. <reflocal="target"/>
  9. </property>
  10. <propertyname="targetMethod">
  11. <value>someJob</value>
  12. </property>
  13. <propertyname="arguments">
  14. <value>Hello!</value>
  15. </property>
  16. </bean>
  17. <beanid="timerTask"class="org.springframework.scheduling.timer.ScheduledTimerTask">
  18. <propertyname="delay">
  19. <value>1000</value>
  20. </property>
  21. <propertyname="period">
  22. <value>3000</value>
  23. </property>
  24. <propertyname="timerTask">
  25. <reflocal="job"/>
  26. </property>
  27. </bean>
  28. <beanid="timerFactory"class="org.springframework.scheduling.timer.TimerFactoryBean">
  29. <propertyname="scheduledTimerTasks">
  30. <list>
  31. <reflocal="timerTask"/>
  32. </list>
  33. </property>
  34. </bean>
  35. </beans>

测试程序TimerMethodInvokerTest.java:

  1. packagecom.learnworld.timer;
  2. importjava.io.IOException;
  3. importorg.springframework.context.ApplicationContext;
  4. importorg.springframework.context.support.FileSystemXmlApplicationContext;
  5. publicclassTimerMethodInvokerTest{
  6. publicstaticvoidmain(String[]args)throwsIOException{
  7. ApplicationContextac=newFileSystemXmlApplicationContext("src/conf/methodInvoker.xml");
  8. System.in.read();
  9. }
  10. }

分享到:
评论

相关推荐

    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