Web服務啓動時 啓動定時器處理相關業務

       啓動服務時,要求啓動定時器進行相關的業務處理。

     這裏使用到兩項技術:1、jsp中的ServletContextListener  來監聽web應用的啓動和關閉。

                                         2、定時器的使用。 

     以下是相關代碼:

package neo.app.servlet;

import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 定時處理相關業務
 * 
 */
public class ContextListener implements ServletContextListener  {
	

	private final Log log = LogFactory.getLog(getClass());

	private Timer timer = null;      //定時器 
	private static int DOWNlOAD_HOUR = 0;    //執行任務開始時間(時) 
	private static int DOWNlOAD_MINUTE = 0;   //執行任務開始時間(分) 
	private static int DOWNlOAD_SECOND = 0;   //執行任務開始時間(秒) 
	private long delay;        //延時時間值(當前系統時間到下載時間之間的時間差毫秒數)
	 
	public void contextDestroyed(ServletContextEvent event) {
		log.info("begin 定時器銷燬");                                                                         
		timer.cancel();
		
	}
	public void contextInitialized(ServletContextEvent event) {
		
		 log.info("begin 定時器啓動");
		 init();//初始化參數  
		 timer = new Timer(true);//創建Timer對象
		 //定時執行程序 
		 String filePath = event.getServletContext().getRealPath("/ckplayer");
		//調用Handle()類(即每天要執行的任務),delay表示延遲毫秒數,0,24*60*60*1000表示每隔一天執行一次任務,60*60*1000表示一個小時;	 
		 timer.schedule(new MyTask(filePath),delay,24*60*60*1000);
	}

	public void init(){

		 //聲明一個Calendar對象  
		Calendar cal = Calendar.getInstance();
		 //設置時間
		cal.set(Calendar.HOUR_OF_DAY, DOWNlOAD_HOUR);        
		cal.set(Calendar.MINUTE, DOWNlOAD_MINUTE);        
		cal.set(Calendar.SECOND, DOWNlOAD_SECOND);        
		Date date = new Date();
		//獲取設定的時間       
		date = cal.getTime();        
		//聲明當前時間        
		Date now = new Date();
		//獲取設定的時間和當前的時間差(毫秒數)
		long interval = date.getTime() - now.getTime();
		
		//如果當前時間大於下載時間,則將下載時間設置爲下一個下載時間        
		if (interval < 0) {
			cal.add(Calendar.DAY_OF_MONTH, 1);//將天數加1            
			date = cal.getTime();            //獲取設定的時間和當前的時間差(毫秒數)            
			interval = date.getTime() - now.getTime();        
		}
		delay = interval;
	}
	
}
	class MyTask  extends TimerTask {
		private final Log log = LogFactory.getLog(getClass());
		Timer timer = null;      
		private String filePath = "";
		
		public MyTask(String f) {
			filePath = f;
			
		}
		/**   
		 * 開始執行  */ 
		public void run() {  
			//開始執行       
			log.info(filePath);
			
                        //這裏是要處理的具體業務方法 同步用戶信息
                        syschronizeSNSUser();  
		}
		
	}


最後在web。xml文件中對ServletContextListener類進行配置,如下所示:

	<listener> 
        <listener-class>neo.app.servlet.ContextListener</listener-class> 
    </listener> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章