近日項目開發中需要執行一些定時任務,比如需要在每天早上9:00,准時發布信息,借此機會整理了一下定時任務的幾種實現方式,由於項目采用spring框架,所以我都將結合
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{
@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
