spring定时任务的几种实现方式

近日项目开发中需要执行一些定时任务,比如需要在每天早上9:00,准时发布信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合

spring框架来介绍。

一.分类

  • 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):

  1. Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。
  2. 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。
  3. Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
  • 从作业类的继承方式来讲,可以分为两类:

  1. 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
  2. 作业类即普通的java类,不需要继承自任何基类。

注:个人推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待。

 

  • 从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
  1. 每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
  2. 每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。

 

二.用法

1、Java自带的java.util.Timer类,自定义一个类继承TimerTask

例子:

package com.timertest;

import java.util.Timer;
import java.util.TimerTask;

public class TestTimerTask {
	
	Timer timer;
	
	public TestTimerTask(int a) {
		timer = new Timer();
		timer.schedule(new GoodTimerTask(),0, 1*a);
	}

	public static void main(String[] args) {
		System.out.println("About to schedule task.");
		new TestTimerTask(3);
	}
	
	class GoodTimerTask extends TimerTask{

		@Override
		public void run() {
			System.out.println("Timer running!");
		}
		
	}
}

 2、Spring3.0以后自带的task

//一、在applicationContext.xml配置的方式
//1、准备jar包
//   (1)spring核心jar包
//2、在项目中写个类
   	@Service
	public class BookScheduleTask {
	
	@Resource
	private BookService bookService;
	
	public Page<Book> findAllBook(){ //不带参数
		System.out.println("BookScheduleTask.findAllBook()");
		return bookService.findBook(1);
	}
	}
//3、在ApplicationContext.xml配置文件中写如下配置:
	<!-- 自动扫描 -->
	<context:component-scan base-package="com" />
	
	<!-- spring框架的Scheduled定时器 -->
	<task:scheduled-tasks>
		<task:scheduled ref="bookScheduleTask" method="findAllBook" cron="0 0 12 * * ?"/>
	</task:scheduled-tasks>

	说明:(1)<context:component-scan base-package="com" />该配置,相信大家用过spring的都知道是什么意思,
	         是spring用于扫描注解的
	      (2)<task:scheduled-tasks>,该配置的作用是定义一个时间计划任务,定义某个类下面某个方法在某个时间执行。
	         <task:scheduled ref="bookScheduleTask" method="findAllBook" cron="0 0 12 * * ?"/>,ref表示的是
		 某个要在规定时间执行的类,method表示要执行的类下的某个方法,cron表示时间表达式,具体详细的表达式
		 可以百度查询。


//二、基于注解的spring定时器
//   1、同上,准备好spring的jar包
//   2、在项目中创建一个类,用于执行定时任务的类。如下:
        @Component("bookScheduleTask")
	public class BookScheduleTask {
	
	@Resource
	private BookService bookService;
	
	@Scheduled(cron="0 50 14 * * ?")
	public void findAllBook(){
		System.out.println("BookScheduleTask.findAllBook()");
		bookService.findBook(1);
	   }
	}
//    说明:基于注解的方法,@Component("bookScheduleTask")表示定义了一个别名。
//	@Scheduled(cron="0 50 14 * * ?")表示:该注解下的方法是一个时间任务,在cron="0 50 14 * * ?"(14:50)执行findAllBook()方法

 3、使用quartz,重量级框架,该方式详见

http://gong1208.iteye.com/blog/1773177

 

更多相关文章
  •     c++中程序员使用模板能够写出与类型无关的代码,提高源代码重用,使用合适,大大提高了开发效率.此前,可以使用宏实现模板的功能,但是模板更加安全.清晰.在编写模板相关的代码是我们用到两个关键词:template和class(或者typename),class和typename基本没有区别. 1 ...
  • 该游戏是一款比较不错的猜拳游戏GuessGame源码案例,GuessGame——猜拳游戏,这也是我自己的第一款休闲类的游戏案例,游戏实现也比较简单的,希望这个能够帮大家的学习和使用,更多安卓源码尽在源码天堂android游戏源码频道.  源码项目下载:http://code.662p.com/vie ...
  • linux系统CentOS7 到http://mirrors.sohu.com/mysql/下载想要的mysql版本 这里用到的是 mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz 用 WinSCP上传到指定的目录下,这里是 /usr/local/src /usr/ ...
  • CentOS 6.3安装nginx操作指南   最近一直在安装nginx,总是有一些问题.困扰了我很久,也查找了很多资料.最后终于搞定了,安装好了.拿出来和大家分享一下!一些依赖的软件包(rpm格式的),已经上传了,gcc分了2个传,因为文件放一起太大了!请大家下载时注意一下! 1.  安装Cent ...
  • 在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如SSD硬盘,用来扩展缓存池.缓存池扩展来得非常方便,如果你不能给你的数据库服务器物理上增加更多的内存, ...
  • 易网科技讯 3月5日消息,前程无忧(Nasdaq:JOBS)今天公布截至2009年12月31日的第四季度财报,财报显示,前程无忧第四季度总收入达3310万美元,环比增长2.9%,同比增长15.1%.运营利润为611.5万美元,环比增长4.2%,同比增长610.2%. 第四季度营收超预期上限 前程无忧 ...
一周排行
  • 吃穿住行O2O,住是传统行业的最后一块自留地. 邓薇表示,爱屋吉屋作为一家完全没有房地产背景的公司,从别人最不要做的鸡肋业务"租房"开始做,现在经过一年时间的积累,已经可以进军竞争远要激烈的二手房 ...
  • 我们先来看下这个站 www.2cto.com(为规避法律问题仅用本站网址替代目标网址) 上图:   http://www.xxx.gov.cn/ 旁站下有这个站 有点可怕 我们来看看 http://www.2cto. ...
  • 选带傅里叶变换的原理大家可以看书.大致的步骤为 移频 (将选带的中心频率移动到零频) 数字低通滤波器 (防止频率混叠) 重新采样 (将采样的数据再次间隔采样,间隔的数据取决于分析的带宽,就是放大倍数) 复FFT (由 ...
  •   hacker如此猖獗,应该采取什么样的有效手段来防止hacker的入侵呢?俗话说:亡羊补牢,为时未晚.人类社会总是在邪恶势力的不断斗争中向前发展的,魔高一尺,道高一丈,总有办法有效地阻止hacker的入侵,保护好 ...
  • 这是ROS入门手记的最后一节,指明了ROS进阶学习的方向:        http://blog.csdn.net/sonictl/article/details/46893443 ROS进阶学习手记 1 -- tu ...
  • Jquery(Ajax) 调用 SharePoint 2013 Search Rest API 并使用Josn反回结果并简单显示:   SharePoint 2010 中使用的 search.asmxSOAPwebs ...
  • 知道在java中除了8中基本类型外,其他的都是类对象以及其引用.所以   "xyz   "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性. ...
  • 今天我们来学习下UGUI的锚点, 他是做什么的呢?  基本上就是用于界面布局. 1. 1个控件对应1个描点.   2. 描点分成四个小叶片,  每1个叶片 对应 控件四边框的角点 3. 不管屏幕如何放大缩小, 控件四 ...
  • 无奈的开头         关于DOM节点操作,如果仅仅是根据标准API来操作,那是最简单不过的了.但是现实中却哪有这么容易的问题让我们解决,其实不仅仅是节点的克隆与删除,节点的添加也是如此,而且添加节点需要考虑的情 ...
  •  首先说明,这里的WiFi模块与日常生活所说的WiFi并不相等,我们也不希望将常用的WiFi妖魔化,而是想提出一些所谓的“将WiFi模块植入传统家电等设备升级为智能家居”可能带来安全问题. 正如智能手机出现后功能手机 ...