啓動服務時,要求啓動定時器進行相關的業務處理。
這裏使用到兩項技術: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>