`
qinjingkai
  • 浏览: 262153 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

spring定时任务之Timer

阅读更多

 

做开发的时候很多时候面临着一个问题,那就是定时任务的问题,比如我之前做的搜索引擎系统,新闻模块每小时更新一次,视频每2小时更新一次,汽车频道没一周更新一次;显然这种更新不应该由人工来完成,一个是工作量非常大,二个是显得很没有技术含量;在这方面spring提供了ScheduledTimerTask,就是通常所说的任务了;把配置好的任务(ScheduledTimerTask)塞到调度器TimerFactoryBean里面就可以了,当然了TimerFactoryBean可以同时执行多个任务;看了一下spring的源代码,ScheduledTimerTask和TimerFactoryBean也很简单,ScheduledTimerTask就是对java.util包下的TimerTask做了简单的封装,而TimerFactoryBean也是对java.util包下的Timer包装一下,现在把源代码放上来看一下:

package org.springframework.scheduling.timer;

import java.util.TimerTask;

public class ScheduledTimerTask
{
  private TimerTask timerTask;
  private long delay = 0L;
  private long period = 0L;
  private boolean fixedRate = false;

  public ScheduledTimerTask(TimerTask timerTask)
  {
    this.timerTask = timerTask;
  }

  public ScheduledTimerTask(TimerTask timerTask, long delay)
  {
    this.timerTask = timerTask;
    this.delay = delay;
  }

  public ScheduledTimerTask(TimerTask timerTask, long delay, long period, boolean fixedRate)
  {
    this.timerTask = timerTask;
    this.delay = delay;
    this.period = period;
    this.fixedRate = fixedRate;
  }

  public void setTimerTask(TimerTask timerTask)
  {
    this.timerTask = timerTask;
  }

  public TimerTask getTimerTask()
  {
    return this.timerTask;
  }

  public void setDelay(long delay)
  {
    this.delay = delay;
  }

  public long getDelay()
  {
    return this.delay;
  }

  public void setPeriod(long period)
  {
    this.period = period;
  }

  public long getPeriod()
  {
    return this.period;
  }

  public void setFixedRate(boolean fixedRate)
  {
    this.fixedRate = fixedRate;
  }

  public boolean isFixedRate()
  {
    return this.fixedRate;
  }
}

 以下是TimerFactoryBean的源代码:

package org.springframework.scheduling.timer;

import java.util.Timer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;

public class TimerFactoryBean
  implements FactoryBean, InitializingBean, DisposableBean
{
  protected final Log logger;
  private ScheduledTimerTask[] scheduledTimerTasks;
  private boolean daemon;
  private Timer timer;

  public TimerFactoryBean()
  {
    this.logger = LogFactory.getLog(super.getClass());

    this.daemon = true;
  }

  public void setScheduledTimerTasks(ScheduledTimerTask[] scheduledTimerTasks)
  {
    this.scheduledTimerTasks = scheduledTimerTasks;
  }

  public void setDaemon(boolean daemon)
  {
    this.daemon = daemon;
  }

  public void afterPropertiesSet() {
    this.logger.info("Initializing Timer");
    this.timer = createTimer(this.daemon);

    for (int i = 0; i < this.scheduledTimerTasks.length; ++i) {
      ScheduledTimerTask scheduledTask = this.scheduledTimerTasks[i];
      if (scheduledTask.getPeriod() > 0L)
      {
        if (scheduledTask.isFixedRate()) {
          this.timer.scheduleAtFixedRate(scheduledTask.getTimerTask(), scheduledTask.getDelay(), scheduledTask.getPeriod());
        }
        else
        {
          this.timer.schedule(scheduledTask.getTimerTask(), scheduledTask.getDelay(), scheduledTask.getPeriod());
        }

      }
      else
      {
        this.timer.schedule(scheduledTask.getTimerTask(), scheduledTask.getDelay());
      }
    }
  }

  protected Timer createTimer(boolean daemon)
  {
    return new Timer(daemon);
  }

  public Object getObject()
  {
    return this.timer;
  }

  public Class getObjectType() {
    return Timer.class;
  }

  public boolean isSingleton() {
    return true;
  }

  public void destroy()
  {
    this.logger.info("Cancelling Timer");
    this.timer.cancel();
  }
}

 最后做一个小demo

步骤:

1开发任务类,也就是继承了java.util.TimerTask的类,并写好该类的run 方法,run方法里面就是要执行的业务逻辑

2 写好spring的application配置文件

package task;

import java.util.Date;
import java.util.TimerTask;

public class NewsTimeTask extends TimerTask{
    private int i=0;
	public void run() {
		System.out.println("开始进行第--"+(++i)+"--次car---新闻的搜集--"+this.getClass().getName()+"/////////"+new Date());
		
	}

}

 

package task;

import java.util.Date;
import java.util.TimerTask;

public class VideoTimerTask extends TimerTask {
	private int i=0;

	public void run() {
		System.out.println("开始进行第--"+(++i)+"--次car---视频的搜集--"+this.getClass().getName()+"/////////"+new Date());

	}

}

 

package task;

import java.util.Date;
import java.util.TimerTask;

public class CarTimerTask extends TimerTask{
	private int i=0;
	public void run(){
		System.out.println("开始进行第--"+(++i)+"--次car---汽车的搜集--"+this.getClass().getName()+"/////////"+new Date());
	}

}
 

 

applicationContext.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!--  
	<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ":/spring-beans.dtd">
-->
<beans>
	<bean id="newsTask" class="task.NewsTimeTask"></bean>
	<bean id="videoTask" class="task.VideoTimerTask"></bean>
	<bean id="carTask" class="task.CarTimerTask"></bean>

	<bean id="newsScheduledTask"
		class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<!-- 系统启动后60秒开始执行 -->
		<property name="delay" value="60000"></property>
		<!-- 每60秒执行一次 -->
		<property name="period" value="60000"></property>
		<property name="timerTask" ref="newsTask"></property>
	</bean>



	<bean id="videoScheduledTask"
		class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay" value="60000"></property>
		<property name="period" value="180000"></property>
		<property name="timerTask" ref="videoTask"></property>
	</bean>
	
	
	<bean id="carScheduledTask"
		class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay" value="60000"></property>
		<property name="period" value="300000"></property>
		<property name="timerTask" ref="carTask"></property>
	</bean>
	
	
	<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
	      <property name="scheduledTimerTasks">
	         <list>
	           <ref bean="newsScheduledTask"/>
	           <ref bean="videoScheduledTask"/>
	           <ref bean="carScheduledTask"/>
	         </list>
	      </property>
	</bean>
</beans>
 

只要启动spring之后任务就自动执行了,不在用做任务其他额外的工作!

程序的输出如下:

开始进行第--1--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:13:27 CST 2009
开始进行第--1--次car---视频的搜集--task.VideoTimerTask/////////Wed Jul 29 10:13:27 CST 2009
开始进行第--1--次car---汽车的搜集--task.CarTimerTask/////////Wed Jul 29 10:13:27 CST 2009
开始进行第--2--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:14:27 CST 2009
开始进行第--3--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:15:27 CST 2009
开始进行第--4--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:16:27 CST 2009
开始进行第--2--次car---视频的搜集--task.VideoTimerTask/////////Wed Jul 29 10:16:27 CST 2009
开始进行第--5--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:17:27 CST 2009
开始进行第--6--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:18:27 CST 2009
开始进行第--2--次car---汽车的搜集--task.CarTimerTask/////////Wed Jul 29 10:18:27 CST 2009
开始进行第--7--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:19:27 CST 2009
开始进行第--3--次car---视频的搜集--task.VideoTimerTask/////////Wed Jul 29 10:19:27 CST 2009
开始进行第--8--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:20:27 CST 2009
开始进行第--9--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:21:27 CST 2009
开始进行第--10--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:22:27 CST 2009
开始进行第--4--次car---视频的搜集--task.VideoTimerTask/////////Wed Jul 29 10:22:27 CST 2009
开始进行第--3--次car---汽车的搜集--task.CarTimerTask/////////Wed Jul 29 10:23:27 CST 2009
开始进行第--11--次car---新闻的搜集--task.NewsTimeTask/////////Wed Jul 29 10:23:27 CST 2009
 

 

 

 

分享到:
评论

相关推荐

    spring定时任务实现

    本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 首先,Java的`java.util.Timer`是一个基础的定时任务工具,它可以按照设定的频率执行任务,但...

    Spring使用timer定时器-能精确几点运行定时任务

    Spring提供了多种方式来实现定时任务,其中之一就是使用`Timer`。`Timer`接口源自Java标准库,但在Spring中,我们可以结合它来创建更加灵活的定时任务。本教程将详细介绍如何在Spring中使用`Timer`来实现能精确到几...

    Spring的定时任务开发及对Quartz和Timer支持

    在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...

    小码农的代码(四)----------JAVA中Timer定时器与Spring定时任务

    在Java编程语言中,`Timer`类和Spring框架的定时任务是两种常见的实现定时执行任务的方式。...在使用Spring定时任务时,结合Spring JDBC,可以定时执行数据库的读写操作,如数据同步、报表生成等。

    Spring的quartz和Timer实现定时

    在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...

    Spring 框架自带定时任务和Quartz定时任务

    在这两种方式中,Spring框架提供了自己的定时任务工具Spring Task,以及与专业定时任务框架Quartz集成的能力。 首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类...

    spring-timer-quartz.zip_namegnd_spring定时任务

    Spring框架提供了强大的定时任务支持,可以方便地与Spring MVC进行集成,实现灵活的定时任务调度。本文将详细介绍如何使用Spring整合Quartz库来创建和管理定时任务。 首先,Spring对定时任务的支持主要通过`org....

    Spring提供的三种定时任务机制及其比较

    在Spring框架中,有三种主要的定时任务机制可供开发者选择,分别是基于Quartz的定时机制、Spring自己的`@Scheduled`注解以及Java的`java.util.Timer`类。在这篇文章中,我们将重点讨论基于Quartz的定时机制,因为它...

    关于 spring 里的定时任务设置

    在Spring框架中,定时任务的实现提供了多种方式,如基于Java Timer API的定时任务和基于Quartz库的定时任务。这两种方法各有优缺点,适用于不同的场景。以下将详细讲解这两种方式。 1. 基于Java Timer API的定时...

    spring2.0学习笔记+spring定时任务

    标题中的“spring2.0学习笔记+spring定时任务”表明了这个压缩包文件包含的是关于Spring框架2.0版本的学习资料,特别是关于Spring的定时任务功能。Spring是Java开发中最广泛应用的轻量级框架之一,它提供了一整套...

    Spring定时任务的几种实现

    ### Spring定时任务的几种实现 #### 一、定时任务实现技术分类 在Spring框架中,实现定时任务的主要技术方案有三种: 1. **Java自带的`java.util.Timer`类**:这种实现方式允许用户调度一个`java.util.TimerTask`...

    Spring整合Quartz后的简单定时任务示例

    本资源"Spring整合Quartz后的简单定时任务示例"提供了如何将这两者结合使用的实例,旨在帮助开发者实现基于Spring的定时任务功能。 首先,我们要理解Spring对定时任务的支持。Spring框架通过`@Scheduled`注解提供了...

    spring 定时任务配置详解

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

    spring定时任务

    总结来说,选择Spring定时任务实现方式时,可以考虑以下几点: 1. 如果任务需求简单,且不需复杂的调度逻辑,可以优先考虑Spring Task,因为它更加轻便,易于集成。 2. 当任务需要复杂的调度策略,或者需要跨应用...

    spring定时.txt

    Spring 框架提供了多种方式来实现定时任务,其中一种常见的做法是利用 `java.util.Timer` 类来实现基本的定时任务功能。此外,对于更复杂的场景,通常会推荐使用 Quartz 这样的第三方库。 ##### Java.util.Timer `...

    Spring定时任务的多种使用方法总结

    Spring框架是Java开发中广泛使用的轻量级框架,它提供了许多功能,其中之一就是定时任务的管理。本篇文章将深入探讨Spring中实现定时任务的多种方式,帮助开发者更好地理解和利用这一特性。 首先,Spring提供了一个...

Global site tag (gtag.js) - Google Analytics