做开发的时候很多时候面临着一个问题,那就是定时任务的问题,比如我之前做的搜索引擎系统,新闻模块每小时更新一次,视频每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中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 首先,Java的`java.util.Timer`是一个基础的定时任务工具,它可以按照设定的频率执行任务,但...
Spring提供了多种方式来实现定时任务,其中之一就是使用`Timer`。`Timer`接口源自Java标准库,但在Spring中,我们可以结合它来创建更加灵活的定时任务。本教程将详细介绍如何在Spring中使用`Timer`来实现能精确到几...
在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...
在Java编程语言中,`Timer`类和Spring框架的定时任务是两种常见的实现定时执行任务的方式。...在使用Spring定时任务时,结合Spring JDBC,可以定时执行数据库的读写操作,如数据同步、报表生成等。
在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...
在这两种方式中,Spring框架提供了自己的定时任务工具Spring Task,以及与专业定时任务框架Quartz集成的能力。 首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类...
Spring框架提供了强大的定时任务支持,可以方便地与Spring MVC进行集成,实现灵活的定时任务调度。本文将详细介绍如何使用Spring整合Quartz库来创建和管理定时任务。 首先,Spring对定时任务的支持主要通过`org....
在Spring框架中,有三种主要的定时任务机制可供开发者选择,分别是基于Quartz的定时机制、Spring自己的`@Scheduled`注解以及Java的`java.util.Timer`类。在这篇文章中,我们将重点讨论基于Quartz的定时机制,因为它...
在Spring框架中,定时任务的实现提供了多种方式,如基于Java Timer API的定时任务和基于Quartz库的定时任务。这两种方法各有优缺点,适用于不同的场景。以下将详细讲解这两种方式。 1. 基于Java Timer API的定时...
标题中的“spring2.0学习笔记+spring定时任务”表明了这个压缩包文件包含的是关于Spring框架2.0版本的学习资料,特别是关于Spring的定时任务功能。Spring是Java开发中最广泛应用的轻量级框架之一,它提供了一整套...
### Spring定时任务的几种实现 #### 一、定时任务实现技术分类 在Spring框架中,实现定时任务的主要技术方案有三种: 1. **Java自带的`java.util.Timer`类**:这种实现方式允许用户调度一个`java.util.TimerTask`...
本资源"Spring整合Quartz后的简单定时任务示例"提供了如何将这两者结合使用的实例,旨在帮助开发者实现基于Spring的定时任务功能。 首先,我们要理解Spring对定时任务的支持。Spring框架通过`@Scheduled`注解提供了...
Spring 定时任务配置详解 Spring 框架提供了对定时调度服务的内置支持类,支持从 JDK 1.3 开始内置的 Timer 类和 Quartz Scheduler。开发者可以通过 FactoryBean,分别指向 Timer 或 Trigger 实例的引用进行配置。...
总结来说,选择Spring定时任务实现方式时,可以考虑以下几点: 1. 如果任务需求简单,且不需复杂的调度逻辑,可以优先考虑Spring Task,因为它更加轻便,易于集成。 2. 当任务需要复杂的调度策略,或者需要跨应用...
Spring 框架提供了多种方式来实现定时任务,其中一种常见的做法是利用 `java.util.Timer` 类来实现基本的定时任务功能。此外,对于更复杂的场景,通常会推荐使用 Quartz 这样的第三方库。 ##### Java.util.Timer `...
Spring框架是Java开发中广泛使用的轻量级框架,它提供了许多功能,其中之一就是定时任务的管理。本篇文章将深入探讨Spring中实现定时任务的多种方式,帮助开发者更好地理解和利用这一特性。 首先,Spring提供了一个...