1. 程式人生 > >專案部署後程序自動執行

專案部署後程序自動執行

在攜程程式中,我們經常會遇到要求能夠在專案部署上線後能夠定時執行,自動執行的要求。現在我就帶大家寫一個簡單的定時器,改定時器可以實現專案部署在tomcat後便可以自動執行,無需執行其他任何操作。首先我們來了解一下編寫的思路。

1、根據要求是要在tomcat啟動的時候就執行,所以我們必須在web.xml中加入一個監聽類。tomcat一啟動監聽類便自動執行。

如何實現這一監聽類?我們需要實現ServletContextListener類來監聽tomcat的啟動,終止。這樣就能實現監聽類在tomcat啟動的時候實現自動執行下面直接上程式碼。

package com.hongyu.utils;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

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

public class AutoRunTimerListener implements ServletContextListener {
	
	//當servlet容器終止web應用是會自動呼叫該方法。在呼叫改方法時會自動銷戶全部的servlet和filter
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("定時傳送Xml資訊監聽--已關閉!");
	}

	//當servlet容器啟動web應用是呼叫改方法,呼叫胡容器在初始化filter,並對需要被初始化的servlet和filter急性型初始化
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// 指定的任務,從指定的延遲後,開始進行重複執行。	
		Calendar calendar = Calendar.getInstance();		
		int year = calendar.get(Calendar.YEAR);	
		int month = calendar.get(Calendar.MONTH);	
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		/**		
		 *  定製每天的10:00:00執行,
		 * 若程式已超過10點啟動,當天不再執行,
		 * 等到明日10點再執行		
		 *  *  這樣保證了時間一直是10點,
		 *  而不會變成程式啟動時間		 */		
		calendar.set(year, month, day, 10, 00, 00);	
		Date defaultdate =calendar.getTime();// 今天10點(預設傳送時間)	
		Date sendDate =new Date();		// 10點後開機	
		//判斷當前的時間是否大於10點,如果是則當天不再執行,如果不是則執行該程式
		if (defaultdate.before(new Date())) {	
			// 將傳送時間設為明天10點			
			calendar.add(Calendar.DATE, 1);	
			sendDate = (Date) calendar.getTime();	
		}
		
		/**
		 * 使用java中自帶的定時類。run方法中便是要定時執行的程式碼或者方法
		 * sTime.schedule(task, delay, period);
		 * task代表要執行的任務,delay表示要延遲執行的時間,period表示要定時執行的頻率。
		 */ 
		Timer sTime=new Timer();
		
		sTime.schedule(new TimerTask() {
			@Override
			public void run() {
				//需要定時執行的程式碼寫在此處
				System.out.println(new Date()+"我正在執行");
			}
		}, sendDate, 1000*60);
		
	}
	

}

編寫監聽類後,我們需要在web.xml中進行配置

 <listener>
    <listener-class>com.hongyu.utils.AutoRunTimerListener</listener-class>
  </listener>

執行的結果

以上的的簡單的定時器實現了在判斷一天的時間是否在10點鐘之前,是則開始執行程式,不是則明日開始執行該程式。