`

Spring定时器的两种实现方式一(timer)

 
阅读更多

有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。

1.Java Timer定时

相信做软件的朋友都有这样的经历,我的软件是不是少了点什么东西呢?比如定时任务啊,

就拿新闻发布系统来说,如果新闻的数据更新太快,势必涉及一个问题,这些新闻不能由人工的去发布,应该让系统自己发布,这就需要用到定时定制任务了,以前定制任务无非就是设计一个Thread,并且设置运行时间片,让它到了那个时间执行一次,就ok了,让系统启动的时候启动它,想来也够简单的。不过有了spring,我想这事情就更简单了。

看看spring的配置文件,想来就只有这个配置文件了

xml 代码
  1. <beanid="infoCenterAutoBuildTask"
  2. class="com.teesoo.teanet.scheduling.InfoCenterAutoBuildTask">
  3. <propertyname="baseService"ref="baseService"/>
  4. <propertyname="htmlCreator"ref="htmlCreator"/>
  5. </bean>
  6. <beanid="scheduledTask"
  7. class="org.springframework.scheduling.timer.ScheduledTimerTask">
  8. <!--wait10secondsbeforestartingrepeatedexecution-->
  9. <propertyname="delay"value="10000"/>
  10. <!--runevery50seconds-->
  11. <propertyname="period"value="1000000"/>
  12. <propertyname="timerTask"ref="infoCenterAutoBuildTask"/>
  13. </bean>
  14. <beanid="timerFactory"class="org.springframework.scheduling.timer.TimerFactoryBean">
  15. <propertyname="scheduledTimerTasks">
  16. <list>
  17. <!--seetheexampleabove-->
  18. <refbean="scheduledTask"/>
  19. </list>
  20. </property>
  21. </bean>

上面三个配置文件中只有一个配置文件是涉及到您自己的class的,其他的都是spring的类。很简单吧

我们只需要涉及一个class让他继承java.util.TimerTask;

java 代码
  1. BaseTaskextendsjava.util.TimerTask{
  2. //用户只需要实现这个方面,把自己的任务放到这里
  3. publicvoidrun(){
  4. }
  5. }

下面让我们来看看 spring的源代码

java 代码
  1. /*
  2. *Copyright2002-2005theoriginalauthororauthors.
  3. *
  4. *LicensedundertheApacheLicense,Version2.0(the"License");
  5. *youmaynotusethisfileexceptincompliancewiththeLicense.
  6. *YoumayobtainacopyoftheLicenseat
  7. *
  8. *http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
  11. *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
  12. *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
  13. *SeetheLicenseforthespecificlanguagegoverningpermissionsand
  14. *limitationsundertheLicense.
  15. */
  16. packageorg.springframework.scheduling.timer;
  17. importjava.util.TimerTask;
  18. /**
  19. *JavaBeanthatdescribesascheduledTimerTask,consistingof
  20. *theTimerTaskitself(oraRunnabletocreateaTimerTaskfor)
  21. *andadelayplusperiod.Periodneedstobespecified;
  22. *thereisnopointinadefaultforit.
  23. *
  24. *<p>TheJDKTimerdoesnotoffermoresophisticatedscheduling
  25. *optionssuchascronexpressions.ConsiderusingQuartzfor
  26. *suchadvancedneeds.
  27. *
  28. *<p>NotethatTimerusesaTimerTaskinstancethatisshared
  29. *betweenrepeatedexecutions,incontrasttoQuartzwhich
  30. *instantiatesanewJobforeachexecution.
  31. *
  32. *@authorJuergenHoeller
  33. *@since19.02.2004
  34. *@seejava.util.TimerTask
  35. *@seejava.util.Timer#schedule(TimerTask,long,long)
  36. *@seejava.util.Timer#scheduleAtFixedRate(TimerTask,long,long)
  37. */
  38. publicclassScheduledTimerTask{
  39. privateTimerTasktimerTask;
  40. privatelongdelay=0;
  41. privatelongperiod=0;
  42. privatebooleanfixedRate=false;
  43. /**
  44. *CreateanewScheduledTimerTask,
  45. *tobepopulatedviabeanproperties.
  46. *@see#setTimerTask
  47. *@see#setDelay
  48. *@see#setPeriod
  49. *@see#setFixedRate
  50. */
  51. publicScheduledTimerTask(){
  52. }
  53. /**
  54. *CreateanewScheduledTimerTask,withdefault
  55. *one-timeexecutionwithoutdelay.
  56. *@paramtimerTasktheTimerTasktoschedule
  57. */
  58. publicScheduledTimerTask(TimerTasktimerTask){
  59. this.timerTask=timerTask;
  60. }
  61. /**
  62. *CreateanewScheduledTimerTask,withdefault
  63. *one-timeexecutionwiththegivendelay.
  64. *@paramtimerTasktheTimerTasktoschedule
  65. *@paramdelaythedelaybeforestartingthetaskforthefirsttime(ms)
  66. */
  67. publicScheduledTimerTask(TimerTasktimerTask,longdelay){
  68. this.timerTask=timerTask;
  69. this.delay=delay;
  70. }
  71. /**
  72. *CreateanewScheduledTimerTask.
  73. *@paramtimerTasktheTimerTasktoschedule
  74. *@paramdelaythedelaybeforestartingthetaskforthefirsttime(ms)
  75. *@paramperiodtheperiodbetweenrepeatedtaskexecutions(ms)
  76. *@paramfixedRatewhethertoscheduleasfixed-rateexecution
  77. */
  78. publicScheduledTimerTask(TimerTasktimerTask,longdelay,longperiod,booleanfixedRate){
  79. this.timerTask=timerTask;
  80. this.delay=delay;
  81. this.period=period;
  82. this.fixedRate=fixedRate;
  83. }
  84. /**
  85. *CreateanewScheduledTimerTask,withdefault
  86. *one-timeexecutionwithoutdelay.
  87. *@paramtimerTasktheRunnabletoscheduleasTimerTask
  88. */
  89. publicScheduledTimerTask(RunnabletimerTask){
  90. setRunnable(timerTask);
  91. }
  92. /**
  93. *CreateanewScheduledTimerTask,withdefault
  94. *one-timeexecutionwiththegivendelay.
  95. *@paramtimerTasktheRunnabletoscheduleasTimerTask
  96. *@paramdelaythedelaybeforestartingthetaskforthefirsttime(ms)
  97. */
  98. publicScheduledTimerTask(RunnabletimerTask,longdelay){
  99. setRunnable(timerTask);
  100. this.delay=delay;
  101. }
  102. /**
  103. *CreateanewScheduledTimerTask.
  104. *@paramtimerTasktheRunnabletoscheduleasTimerTask
  105. *@paramdelaythedelaybeforestartingthetaskforthefirsttime(ms)
  106. *@paramperiodtheperiodbetweenrepeatedtaskexecutions(ms)
  107. *@paramfixedRatewhethertoscheduleasfixed-rateexecution
  108. */
  109. publicScheduledTimerTask(RunnabletimerTask,longdelay,longperiod,booleanfixedRate){
  110. setRunnable(timerTask);
  111. this.delay=delay;
  112. this.period=period;
  113. this.fixedRate=fixedRate;
  114. }
  115. /**
  116. *SettheRunnabletoscheduleasTimerTask.
  117. *@seeDelegatingTimerTask
  118. */
  119. publicvoidsetRunnable(RunnabletimerTask){
  120. this.timerTask=newDelegatingTimerTask(timerTask);
  121. }
  122. /**
  123. *SettheTimerTasktoschedule.
  124. */
  125. publicvoidsetTimerTask(TimerTasktimerTask){
  126. this.timerTask=timerTask;
  127. }
  128. /**
  129. *ReturntheTimerTasktoschedule.
  130. */
  131. publicTimerTaskgetTimerTask(){
  132. returntimerTask;
  133. }
  134. /**
  135. *Setthedelaybeforestartingthetaskforthefirsttime,
  136. *inmilliseconds.Defaultis0,immediatelystartingthe
  137. *taskaftersuccessfulscheduling.
  138. */
  139. publicvoidsetDelay(longdelay){
  140. this.delay=delay;
  141. }
  142. /**
  143. *Returnthedelaybeforestartingthejobforthefirsttime.
  144. */
  145. publiclonggetDelay(){
  146. returndelay;
  147. }
  148. /**
  149. *Settheperiodbetweenrepeatedtaskexecutions,inmilliseconds.
  150. *Defaultis0,leadingtoone-timeexecution.Incaseofapositive
  151. *value,thetaskwillbeexecutedrepeatedly,withthegiveninterval
  152. *inbetweenexecutions.
  153. *<p>Notethatthesemanticsoftheperiodvarybetweenfixed-rate
  154. *andfixed-delayexecution.
  155. *@see#setFixedRate
  156. */
  157. publicvoidsetPeriod(longperiod){
  158. this.period=period;
  159. }
  160. /**
  161. *Returntheperiodbetweenrepeatedtaskexecutions.
  162. */
  163. publiclonggetPeriod(){
  164. returnperiod;
  165. }
  166. /**
  167. *Setwhethertoscheduleasfixed-rateexecution,ratherthan
  168. *fixed-delayexecution.Defaultis"false",i.e.fixeddelay.
  169. *<p>SeeTimerjavadocfordetailsonthoseexecutionmodes.
  170. *@seejava.util.Timer#schedule(TimerTask,long,long)
  171. *@seejava.util.Timer#scheduleAtFixedRate(TimerTask,long,long)
  172. */
  173. publicvoidsetFixedRate(booleanfixedRate){
  174. this.fixedRate=fixedRate;
  175. }
  176. /**
  177. *Returnwhethertoscheduleasfixed-rateexecution.
  178. */
  179. publicbooleanisFixedRate(){
  180. returnfixedRate;
  181. }
  182. }

说实话这个类也没什么,只是简单的包装了我们的timertask,里面也就只有几个属性,一个是时间片,一个是任务等。

真正运行我们的任务的类是:

java 代码
  1. /*
  2. *Copyright2002-2006theoriginalauthororauthors.
  3. *
  4. *LicensedundertheApacheLicense,Version2.0(the"License");
  5. *youmaynotusethisfileexceptincompliancewiththeLicense.
  6. *YoumayobtainacopyoftheLicenseat
  7. *
  8. *http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
  11. *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
  12. *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
  13. *SeetheLicenseforthespecificlanguagegoverningpermissionsand
  14. *limitationsundertheLicense.
  15. */
  16. packageorg.springframework.scheduling.timer;
  17. importjava.util.Timer;
  18. importorg.apache.commons.logging.Log;
  19. importorg.apache.commons.logging.LogFactory;
  20. importorg.springframework.beans.factory.DisposableBean;
  21. importorg.springframework.beans.factory.FactoryBean;
  22. importorg.springframework.beans.factory.InitializingBean;
  23. /**
  24. *FactoryBeanthatsetsupaJDK1.3+Timerandexposesitforbeanreferences.
  25. *
  26. *<p>AllowsforregistrationofScheduledTimerTasks,automaticallystarting
  27. *theTimeroninitializationandcancellingitondestructionofthecontext.
  28. *Inscenariosthatjustrequirestaticregistrationoftasksatstartup,
  29. *thereisnoneedtoaccesstheTimerinstanceitselfinapplicationcode.
  30. *
  31. *<p>NotethatTimerusesaTimerTaskinstancethatissharedbetween
  32. *repeatedexecutions,incontrasttoQuartzwhichinstantiatesanew
  33. *Jobforeachexecution.
  34. *
  35. *@authorJuergenHoeller
  36. *@since19.02.2004
  37. *@seeScheduledTimerTask
  38. *@seejava.util.Timer
  39. *@seejava.util.TimerTask
  40. */
  41. publicclassTimerFactoryBeanimplementsFactoryBean,InitializingBean,DisposableBean{
  42. protectedfinalLoglogger=LogFactory.getLog(getClass());
  43. privateScheduledTimerTask[]scheduledTimerTasks;
  44. privatebooleandaemon=false;
  45. privateTimertimer;
  46. /**
  47. *RegisteralistofScheduledTimerTaskobjectswiththeTimerthat
  48. *thisFactoryBeancreates.DependingoneachSchedulerTimerTask's
  49. *settings,itwillberegisteredviaoneofTimer'sschedulemethods.
  50. *@seejava.util.Timer#schedule(java.util.TimerTask,long)
  51. *@seejava.util.Timer#schedule(java.util.TimerTask,long,long)
  52. *@seejava.util.Timer#scheduleAtFixedRate(java.util.TimerTask,long,long)
  53. */
  54. publicvoidsetScheduledTimerTasks(ScheduledTimerTask[]scheduledTimerTasks){
  55. this.scheduledTimerTasks=scheduledTimerTasks;
  56. }
  57. /**
  58. *Setwhetherthetimershoulduseadaemonthread,
  59. *justexecutingaslongastheapplicationitselfisrunning.
  60. *<p>Defaultis"false":Thetimerwillautomaticallygetcancelledon
  61. *destructionofthisFactoryBean.Hence,iftheapplicationshutsdown,
  62. *taskswillbydefaultfinishtheirexecution.Specify"true"foreager
  63. *shutdownofthreadsthatexecutetasks.
  64. *@seejava.util.Timer#Timer(boolean)
  65. */
  66. publicvoidsetDaemon(booleandaemon){
  67. this.daemon=daemon;
  68. }
  69. publicvoidafterPropertiesSet(){
  70. logger.info("InitializingTimer");
  71. this.timer=createTimer(this.daemon);
  72. //RegisterallScheduledTimerTasks.
  73. if(this.scheduledTimerTasks!=null){
  74. for(inti=0;i<this.scheduledTimerTasks.length;i++){
  75. ScheduledTimerTaskscheduledTask=this.scheduledTimerTasks[i];
  76. if(scheduledTask.getPeriod()>0){
  77. //repeatedtaskexecution
  78. if(scheduledTask.isFixedRate()){
  79. this.timer.scheduleAtFixedRate(
  80. scheduledTask.getTimerTask(),scheduledTask.getDelay(),scheduledTask.getPeriod());
  81. }
  82. else{
  83. this.timer.schedule(
  84. scheduledTask.getTimerTask(),scheduledTask.getDelay(),scheduledTask.getPeriod());
  85. }
  86. }
  87. else{
  88. //One-timetaskexecution.
  89. this.timer.schedule(scheduledTask.getTimerTask(),scheduledTask.getDelay());
  90. }
  91. }
  92. }
  93. }
  94. /**
  95. *CreateanewTimerinstance.Calledby<code>afterPropertiesSet</code>.
  96. *CanbeoverriddeninsubclassestoprovidecustomTimersubclasses.
  97. *@paramdaemonwhethertocreateaTimerthatrunsasdaemonthread
  98. *@returnanewTimerinstance
  99. *@see#afterPropertiesSet()
  100. *@seejava.util.Timer#Timer(boolean)
  101. */
  102. protectedTimercreateTimer(booleandaemon){
  103. returnnewTimer(daemon);
  104. }
  105. publicObjectgetObject(){
  106. returnthis.timer;
  107. }
  108. publicClassgetObjectType(){
  109. returnTimer.class;
  110. }
  111. publicbooleanisSingleton(){
  112. returntrue;
  113. }
  114. /**
  115. *CanceltheTimeronbeanfactoryshutdown,stoppingallscheduledtasks.
  116. *@seejava.util.Timer#cancel()
  117. */
  118. publicvoiddestroy(){
  119. logger.info("CancellingTimer");
  120. this.timer.cancel();
  121. }
  122. }

这个类就是运行我们任务的类了,我们可以定制N个任务,只需要塞到这里就ok了

分享到:
评论

相关推荐

    spring定时器两种实现方式

    Spring 定时器两种实现方式 Spring 定时器是 Spring 框架中的一种组件,用于实现定时任务的执行。它提供了两种实现方式:Java Timer 定时和 Quartz 定时器。在本文中,我们将详细介绍这两种实现方式的原理、优点和...

    spring定时器 Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。

    Spring框架提供了两种方式来处理定时任务:Java内置的`Timer`类和第三方库OpenSymphony的Quartz。下面将详细介绍这两种实现方式。 ### 1. Java `Timer` 类 Java `java.util.Timer` 类是Java标准库中的一个轻量级...

    Spring定时器实例(Java的Timer类和OpenSymphony的Quartz)

    Spring两种定时器实例配置:Java的TimerTask类和OpenSymphony的Quartz。包含5种配置方式:timer普通定时器、timer特定方法定时器、quartz简单定时器、quartz精确定时器、quartz特定方法定时器。简单实用,一看就会。

    Spring定时器的两种实现方式.doc

    在Spring框架中,定时任务的实现通常有多种方式,这里主要讨论的是两种常见的方式:Java Timer和Quartz定时器。这两种方法都有其特点和适用场景,开发者可以根据项目需求来选择。 1. **Java Timer定时器** Java ...

    java 定时器 spring 定时器

    首先,Java定时器(java.util.Timer)是Java标准库提供的一种基础定时服务。它允许开发者安排一次性或重复的任务,这些任务将以单独的线程运行,不影响主线程的工作。创建定时器时,通常会使用`new Timer()`构造函数...

    JAVA中 Spring定时器的两种实现方式

    在Java的Spring框架中,定时任务的实现有多种方式,其中两种常见的实现是基于Java的`Timer`类和OpenSymphony的`Quartz`库。这两种定时器在Spring中的使用和配置有所不同,各有优缺点,适合不同的应用场景。 1. **...

    SPRING 定时器的使用

    在Spring框架中,实现定时任务有两种主流方式:使用`java.util.Timer`类或集成第三方库如Quartz。这两种方法各有优势: - **Java Timer**:简单易用,适合简单的定时任务需求。 - **Quartz**:功能强大且灵活,支持...

    spring定时器的包和配置文件

    Spring定时器基于Java的`java.util.Timer`和`java.util.TimerTask`,但更进一步,它支持Quartz和SimpleScheduler这两种强大的定时任务库。Quartz是一个开源的作业调度框架,而SimpleScheduler则内置在Spring中,适用...

    spring定时器3.0之前和3.0之后以及相应的项目实例

    在提供的压缩包文件中,可能包含了使用上述两种方式实现的项目实例代码,你可以通过这些实例学习如何在不同的Spring版本下配置和使用定时任务。对于初学者来说,理解这些实例有助于深入掌握Spring的定时任务管理,并...

    spring定时器实例

    Spring提供了两种主要的调度组件:`org.springframework.scheduling.timer.TimerTaskExecutor`(基于Java的`java.util.Timer`)和`org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor`(基于线程池...

    使用java定时器的几种方式

    在Java中实现定时任务有多种方式,...总之,Java中实现定时任务的三种主要方式各有特点,从简单的Timer到功能强大的Quartz再到易用的Spring Task,开发者可以根据自己的具体需求和场景,选择合适的定时任务实现方式。

    关于给springboot添加定时器的两种方式

    这两种方法都可以有效地在Spring Boot中实现定时任务的功能。第一种方法更为常见,因为它允许你在主类中直接启用定时任务功能;而第二种方法则可以让主类保持简洁,适合那些希望将定时任务与业务逻辑分离的场景。...

    spring和java定时器

    Spring框架和Java内置的定时器提供了两种不同的方式来实现这样的功能。 首先,我们来看Spring定时器。Spring使用的是Quartz库来实现定时任务管理。在给出的例子中,可以看到配置文件中定义了几个关键的bean: 1. `...

    spring 定时器

    Spring定时器主要通过`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`两种方式来实现。但在Spring中更常用的是基于`@Scheduled`注解的方式,这种方式更加简洁且易于集成。 #### 三、Spring...

    spring定时器--代码解读

    本篇文章将详细解读如何在Spring中实现定时任务,包括两种不同的实现方式:基于Timer的任务调度和基于Quartz的作业调度。 首先,我们来看基于Timer的定时任务实现。在Spring中,可以通过`ScheduledTimerTask`和`...

    Spring定时器的实例.pdf

    Spring中实现定时任务通常有两种方式:一是使用@Scheduled注解,二是使用Spring Task的TaskScheduler接口。在这个例子中,ScheduledTimer类可能被Spring容器管理,并通过@Scheduled注解或配置文件来设置定时任务的...

    java Timer定时器实例 Spring实例.doc

    `Timer` 类提供了两种计划任务的方法:`schedule(TimerTask task, long delay)` 和 `scheduleAtFixedRate(TimerTask task, long delay, long period)`。前者会在指定的延迟后执行一次任务,而后者则会按照固定的延迟...

    java_Timer定时器实例_Spring实例

    Java的`java.util.Timer`类用于调度线程在特定时间执行任务,它提供了两种任务执行方式:`schedule()`和`scheduleAtFixedRate()`。前者用于定期执行任务,但每次执行之间的时间间隔可能因任务执行时间而有所不同;后...

    Spring 定时器.txt

    本文档将详细介绍这两种定时器的配置过程及其在 Spring 中的应用。 #### 二、Java Timer 在 Spring 中的应用 ##### 2.1 简单定时器的定义 Spring 支持通过 `java.util.Timer` 类来实现简单的定时任务。这种定时器...

    spring的定时器设置

    总结,Spring的定时任务设置在不同版本中有不同的实现方式,2.x版本依赖于`Timer`,而3.x版本引入了更为灵活的`@Scheduled`注解和`Quartz`支持,使得定时任务的配置和管理更加简便。在实际项目中,可以根据需求选择...

Global site tag (gtag.js) - Google Analytics