spring定时任务的几种实现方式
一.分类
从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):
- Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。
- 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
- Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
从作业类的继承方式来讲,可以分为两类:
作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;
java.util.Timer中需要继承自java.util.TimerTask。
作业类即普通的java类,不需要继承自任何基类。
从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
每到指定时间则触发一次,在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, 1000*a);}public static void main(String[] args) {System.out.println("About to schedule task.");new TestTimerTask(3);}class GoodTimerTask extends TimerTask{@Overridepublic void run() {System.out.println("Timer running!");}}
}
2、Spring3.0以后自带的task
//一、在applicationContext.xml配置的方式
//1、准备jar包
// (1)spring核心jar包
//2、在项目中写个类@Servicepublic class BookScheduleTask {@Resourceprivate 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 {@Resourceprivate 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,重量级框架
这里不做详细介绍