1. 程式人生 > >java Web專案中的定時器實現

java Web專案中的定時器實現

在Java的6.0版本中新增了concurrent包,這個包是用作執行緒同步的包,提供了很多工具類。 
其中定時器就是其中之一。近期在做一個專案,在專案中要實現啟動Web服務的同時啟動一個任務,要求此任務為守護程序,定時呼叫一些任務操作程式碼。在網上搜索相關的實現,綜合考慮得出一個解決方案。方案是:使用tomcat伺服器的監聽器類作守護程序,呼叫concurrent包提供的定時器,最後在定時器中呼叫操作實現程式碼。具體實現類Translator在這裡不再給出,將其替換為自己需要的實現類即可。 

定時器類: 

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.translate.Translator; 

/**
 * 定時器類
 * @author ahomeeye
 */
public class TranslateTimer {

	private final ScheduledExecutorService scheduler = Executors
			.newScheduledThreadPool(1);
	Translator tranChinese = new Translator(); //操作實現類,我這裡為翻譯類

	public void executeTranslateTimer() {

		Runnable task = new Runnable() {

			public void run() {
				// 翻譯
				tranChinese.translateGo(); //呼叫操作實現方法
				
				System.out.println("--------------翻譯:" + new Date().getTime()
						+ "------------------");
			}
		};
        if (scheduler.isShutdown()) {
            scheduler = Executors.newScheduledThreadPool(1);
            scheduler.scheduleAtFixedRate(task, 10, 30, TimeUnit.SECONDS);
        } else {
            scheduler.scheduleAtFixedRate(task, 10, 30, TimeUnit.SECONDS); // 延遲10秒,每隔30秒翻譯一次
        }
	}

 //停止任務,不再提交新任務,已提交任務會繼續執行以致完成
  public void stop() {
        scheduler.shutdown();
  }

}

監聽器類:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.send.timer.SendDataTimer;
import com.send.timer.TransferDataTimer;
import com.send.timer.TranslateTimer;

public class StartTimerListener implements ServletContextListener {

	TranslateTimer tranTimer = null;

	/**
	 * 建立一個初始化監聽器物件,一般由容器呼叫
	 */
	public StartTimerListener() {
		super();
	}

	/**
	 * 讓Web程式執行的時候自動載入Timer
	 */
	public void contextInitialized(ServletContextEvent e) {
		System.out.println("-------------StartTimerListener.init-------------");
		tranTimer = new TranslateTimer(); // 啟動翻譯資料定時器
		tranTimer.executeTranslateTimer();
	}

	/**
	 * 該方法由容器呼叫 空實現
	 */
	public void contextDestroyed(ServletContextEvent e) {
	}
}

在Java Web專案的web.xml檔案中加入以下幾行,注意包路徑,向tomcat伺服器宣告監聽器。 
	<listener>
		<listener-class>com.servlet.StartTimerListener</listener-class>
	</listener>