- package
axtic.servlet; -
// 下面就Servlet偵聽器結合Java定時器來講述整個實現過程。要運用Servlet偵聽器需要實現 javax.servlet.ServletContextListener接口,同時實現它的 contextInitialized(ServletContextEvent event)和 contextDestroyed(ServletContextEvent event)兩個接口函數。考慮定時器有個建立和銷毀的過程,看了前面兩個接口函數,就不容置疑的把建立的過程置入contextInitialized,把銷毀的過程置入contextDestroyed了。 -
- import
java.util.Timer; //定時器類 - import
axtic.bean.exportHistoryBean; - import
javax.servlet.ServletContextEvent; - import
javax.servlet.ServletContextListener; - public
class SysContextListener implementsServletContextListener - {
-
private Timer null;timer = -
public void contextInitialized(ServletContextEvent event) -
{//在這里初始化監聽器,在tomcat啟動的時候監聽器啟動,可以在這里實現定時器功能 -
timer = new Timer( true); -
event.getServletContext().log("定時器已啟動");//添加日志,可在tomcat日志中查看到 -
timer.schedule(new exportHistoryBean(event.getServletContext()), 0,5*1000);//調用exportHistoryBean,0表示任務無延遲,5*1000表示每隔5秒執行任務,60*60*1000表示一個小時。 -
event.getServletContext().log("已經添加任務"); -
} -
public void contextDestroyed(ServletContextEvent event) -
{//在這里關閉監聽器,所以在這里銷毀定時器。 -
timer.cancel(); -
event.getServletContext().log("定時器銷毀"); -
} - }
接下來可以編寫自己的功能類,此類一定要extends定時器類中TimerTask .下面介紹TimerTask的實現,上面的代碼中看到了在構造Timer Task時,傳入了javax.servlet.ServletContext類型參數,是為記錄Servlet日志方便而傳入,因此需要重載Timer Task的構造函數(其父類java.util.TimerTask原構造函數是沒有參數的)。在timer.schedule()的調度中,設置了每小時調度一次,因此如果想實現調度任務每24小時被執行一次,還需要判斷一下時鍾點,以常量C_SCHEDULE_HOUR 表示(晚上12點,也即0點)。同時為防止24小時執行下來,任務還未執行完(當然,一般任務是沒有這么長的),避免第二次又被調度以引起執行沖突,設置了當前是否正在執行的狀態標志isRunning。示例代碼如下所示:
- package
axtic.bean; -
- import
java.util.Calendar; - import
java.util.TimerTask; - import
javax.servlet.ServletContext; - public
class exportHistoryBean extendsTimerTask - {
-
private static final int C_SCHEDULE_HOUR 0;= -
private static boolean isRunning false;= -
private ServletContext null;context = -
public exportHistoryBean(ServletContext context) -
{ -
this.context = context; -
} -
-
public void run() -
{ -
Calendar c = Calendar.getInstance(); -
if(!isRunning) -
{ -
if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) -
{ -
isRunning = true; -
context.log("開始執行指定任務"); -
//-------------------開始保存當日歷史記錄 -
-
-
-
//在這里編寫自己的功能,例: -
//File file = new File("temp"); -
//file.mkdir(); -
//啟動tomcat,可以發現在tomcat根目錄下,會自動創建temp文件夾 -
-
//-------------------結束 -
isRunning = false; -
context.log("指定任務執行結束"); -
} -
else -
{ -
context.log("上一次任務執行還未結束"); -
} -
} -
} - }
- <web-app>
-
- <listener>
-
<listener-class> -
axtic.servlet.SysContextListener -
</listener-class> - </listener>
-
-
- <servlet/>
- <servlet-mapping/>
- </web-app>