做开发的时候很多时候面临着一个问题,那就是定时任务的问题,比如我之前做的搜索引擎系统,新闻模块每小时更新一次,视频每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使用timer定时器-能精确几点运行定时任务的小demo
使用spring实现定时任务,整合spring,springmvc,实现定时任务执行
源码 博文链接:https://zmx.iteye.com/blog/1479602
这个资源中,是我对spring与quartz进行的整合,为了方便以后的使用,以及本着好东西大家分享的原则,在此就上传了,希望各位能提出宝贵的意见或建议,共同进步,谢谢
NULL 博文链接:https://675990021.iteye.com/blog/2265945
这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...
茴香豆的“茴”有几种写法? spring 整合 quartz|| ...我收集的:《spring定时Timer&Quartz》 代码示例,依赖spring2.x.jar quartz1.6.x.jar 相关介绍: http://blog.csdn.net/liu251/archive/2009/08/18/4459514.aspx
java 中Spring task定时任务的深入理解 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象。这就意味着spring容许你使用其他...
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。 我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量...
spring实现定时任务的方式有三种,分别是java自带的timer类、spring task和quartz三种。本文只介绍spring自带的task和第三方quartz,感兴趣的朋友参考下吧
spring+quartz demo 源码送上很好用,下载之后就可以运行,例子很好看懂的,里面还有timer定时器的一些佩法
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。...Quartz在功能上远远超越了JDK自带的Timer,很好很强大!
任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9...
2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1....
spring定时器架包,方便配置spring的定时执行既定的程序或任务
在我了解的过程中发现java实现定时任务有四种,首先是jdk自带的两个Timer,ScheduledThreadPoolExecutor,后者是jdk1.5提出的,因为这个Timer毛病着实有点多,像什么单线程,出问题了其他任务也执
2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1....
2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1...
2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1....
SpringBoot实现定时任务的四种方式: 1.Timer, 2.Timer, 3.Spring Task 4.Quartz。 time-task-demo.zip