spring定時任務的幾種實現方式

近日項目開發中須要執行一些定時任務,好比須要在天天早上9:00,準時發佈信息,藉此機會整理了一下定時任務的幾種實現方式,因爲項目採用spring框架,因此我都將結合java

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類,不須要繼承自任何基類。

注:我的推薦使用第二種方式,由於這樣因此的類都是普通類,不須要事先區別對待。app

 

  • 從任務調度的觸發時機來分,這裏主要是針對做業使用的觸發器,主要有如下兩種:
  1. 每隔指定時間則觸發一次,在Quartz中對應的觸發器爲:org.springframework.scheduling.quartz.SimpleTriggerBean
  2. 每到指定時間則觸發一次,在Quartz中對應的調度器爲:org.springframework.scheduling.quartz.CronTriggerBean

注:並不是每種任務均可以使用這兩種觸發器,如java.util.TimerTask任務就只能使用第一種。Quartz和spring task均可以支持這兩種觸發條件。框架

 

二.用法

一、Java自帶的java.util.Timer類,自定義一個類繼承TimerTaskide

例子:component

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!");
		}
		
	}
}

 二、Spring3.0之後自帶的taskxml

//1、在applicationContext.xml配置的方式
//一、準備jar包
//   (1)spring核心jar包
//二、在項目中寫個類
   	@Service
	public class BookScheduleTask {
	
	@Resource
	private BookService bookService;
	
	public Page<Book> findAllBook(){ //不帶參數
		System.out.println("BookScheduleTask.findAllBook()");
		return bookService.findBook(1);
	}
	}
//三、在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表示時間表達式,具體詳細的表達式
		 能夠百度查詢。


//2、基於註解的spring定時器
//   一、同上,準備好spring的jar包
//   二、在項目中建立一個類,用於執行定時任務的類。以下:
        @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()方法

 三、使用quartz,重量級框架,該方式詳見blog

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

相關文章
相關標籤/搜索