JAVA自動執行任務_第1頁
JAVA自動執行任務_第2頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1好多朋友用過Windows的任務計劃,也有不少程序迷自己曾寫過時鐘報警、系統自動關機等趣味程序,可卻很少有朋友在Web工程中實現過類似功能。當Web工程啟動時,定時器能自動開始計時,在整個Web工程的生命期里,定時器能在每晚深夜觸發一次任務。因此定時器的存放位置也值得考查,不能簡單的存在于單個Servlet或JavaBean中,必須能讓定時器宿主的存活期為整個Web工程生命期,在工程啟動時能自動加載運行。結合這兩點,跟Servlet上下文有關的偵聽器就最合適不過了,通過在工程的配置文件中加以合理配置,會在工程啟動時自動運行,并在整個工程生命期中處于監聽狀態。下面就Servlet偵聽器結合Ja

2、va定時器來講述整個實現過程。要運用Servlet偵聽器需要實現javax.servlet.ServletContextListener接口, 同時實現它的contextInitialized(ServletContextEventevent)和contextDestroyed(ServletContextEventevent)兩個接口函數。考慮定時器有個建立和銷毀的過程,看了前面兩個接口函數,就不容置疑的把建立的過程置入contextInitialized,把銷毀的過程置入contextDestroyed了。我把ServletContextListener的實現類取名為ContextList

3、ener在其內添加一個定時器,示例代碼如下所示:importjava.util.Timer;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServlet;publicclassContextListener

4、extendsHttpServletimplementsServletContextListenerpublicContextListener()privatejava.util.Timertimer=null;publicvoidcontextInitialized(ServletContextEventevent)timer=newjava.util.Timer(true);event.getServletContext().log(定時器已啟動”);timer.schedule(newMyTask(event.getServletContext(),0,60*60*1000);event

5、.getServletContext().log(已經添加任務調度表);publicvoidcontextDestroyed(ServletContextEventevent)timer.cancel();event.getServletContext().log(定時器銷毀”);2以上代碼中,timer.schedule(newMyTask(event.getServletContext(),0,60*60*1000)這一行為定時器調度語句,其中MyTask是自定義需要被調度的執行任務(在我的財政數據中心項目中就是報表計算引擎入口),從java.util.TimerTask繼承,下面會重點講

6、述,第三個參數表示每小時(即60*60*1000毫秒)被觸發一次,中間參數0表示無延遲。其它代碼相當簡單,不再詳細說明。下面介紹MyTask的實現,上面的代碼中看到了在構造MyTask時,傳入了javax.servlet.ServletContext類型參數,是為記錄Servlet日志方便而傳入,因此需要重載MyTask的構造函數(其父類java.util.TimerTask原構造函數是沒有參數的)。在timer.schedule()的調度中,設置了每小時調度一次,因此如果想實現調度任務每24小時被執行一次, 還需要判斷一下時鐘點,以常量C_SCHEDULE_HOUR表示(晚上12點,也即0點

7、)。同時為防止24小時執行下來,任務還未執行完(當然,一般任務是沒有這么長的。,避免第二次又被調度以引起執行沖突,設置了當前是否正在執行的狀態標志isRunning。示例代碼如下所示:importjava.util.*;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse

8、;importjavax.servlet.http.HttpServlet;importjavax.servlet.*;publicclassMyTaskextendsTimerTaskprivatestaticfinalintC_SCHEDULE_HOUR=0;privatestaticbooleanisRunning=false;privateServletContextcontext=null;publicMyTask()publicMyTask(ServletContextcontext)this.context=context;publicvoidrun()Calendarcal=C

9、alendar.getInstance();if(!isRunning)if(C_SCHEDULE_HOUR=cal.get(Calendar.HOUR_OF_DAY)isRunning=true;context.log(開始執行指定任務);/TODO添加自定義的詳細任務,以下只是示例/系統定時接收郵件Emailemail=newEmail();email.recieve();isRunning=false;context.log(”指定任務執行結束);else3context.log(上一次任務執行還未結束”);到這兒,ServletContextListener和MyTask的代碼都已完整了。最后一步就是把ServletContextListen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論