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, 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM