好多朋友用過Windows的任務計劃 也有不少程序迷自己曾寫過時鐘報警 系統(tǒng)自動關機等趣味程序 可卻很少有朋友在Web工程中實現(xiàn)過類似功能
在陽泉等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網站制作、做網站、外貿營銷網站建設 網站設計制作定制網站,公司網站建設,企業(yè)網站建設,高端網站設計,成都營銷網站建設,成都外貿網站建設公司,陽泉網站建設費用合理。
當Web工程啟動時 定時器能自動開始計時 在整個Web工程的生命期里 定時器能在每晚深夜觸發(fā)一次任務 因此定時器的存放位置也值得考查 不能簡單的存在于單個Servlet或JavaBean中 必須能讓定時器宿主的存活期為整個Web工程生命期 在工程啟動時能自動加載運行 結合這兩點 跟 Servlet上下文有關的偵聽器就最合適不過了 通過在工程的配置文件中加以合理配置 會在工程啟動時自動運行 并在整個工程生命期中處于監(jiān)聽狀態(tài)
下面就Servlet偵聽器結合Java定時器來講述整個實現(xiàn)過程 要運用Servlet偵聽器需要實現(xiàn) javax servlet ServletContextListener接口 同時實現(xiàn)它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個接口函數 考慮定時器有個建立和銷毀的過程 看了前面兩個接口函數 就不容置疑的把建立的過程置入 contextInitialized 把銷毀的過程置入contextDestroyed了
我把ServletContextListener的實現(xiàn)類取名為ContextListener 在其內添加一個定時器 示例代碼如下所示
import java util Timer;
import javax servlet ServletContextEvent;
import javax servlet ServletContextListener;
import javax servlet ServletException;
import javax servlet ServletRequest;
import javax servlet ServletResponse;
import javax servlet HttpServlet;
public class ContextListener
extends HttpServlet
implements ServletContextListener {
public ContextListener() {
}
private java util Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java util Timer(true);
event getServletContext() log( 定時器已啟動 );
timer schedule(new MyTask(event getServletContext()) * * );
event getServletContext() log( 已經添加任務調度表 );
}
public void contextDestroyed(ServletContextEvent event) {
timer cancel();
event getServletContext() log( 定時器銷毀 );
}
}
以上代碼中 timer schedule(new MyTask(event getServletContext()) * * )這一行為定時器調度語句 其中MyTask是自定義需要被調度的執(zhí)行任務(在我的財政數據中心項目中就是報表計算引擎入口) 從 java util TimerTask繼承 下面會重點講述 第三個參數表示每小時(即 * * 毫秒)被觸發(fā)一次 中間參數 表示無延遲 其它代碼相當簡單 不再詳細說明
下面介紹MyTask的實現(xiàn) 上面的代碼中看到了在構造MyTask時 傳入了javax servlet ServletContext類型參數 是為記錄Servlet日志方便而傳入 因此需要重載MyTask的構造函數(其父類java util TimerTask原構造函數是沒有參數的) 在timer schedule()的調度中 設置了每小時調度一次 因此如果想實現(xiàn)調度任務每 小時被執(zhí)行一次 還需要判斷一下時鐘點 以常量C_SCHEDULE_HOUR表示(晚上 點 也即 點) 同時為防止 小時執(zhí)行下來 任務還未執(zhí)行完(當然 一般任務是沒有這么長的) 避免第二次又被調度以引起執(zhí)行沖突 設置了當前是否正在執(zhí)行的狀態(tài)標志isRunning 示例代碼如下所示
import java util *;
import javax servlet ServletContextEvent;
import javax servlet ServletContextListener;
import javax servlet ServletException;
import javax servlet ServletRequest;
import javax servlet ServletResponse;
import javax servlet HttpServlet;
import javax servlet *;
public class MyTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = ;
private static boolean isRunning = false;
private ServletContext context = null;
public MyTask() {
}
public MyTask(ServletContext context) {
ntext = context;
}
public void run() {
Calendar cal = Calendar getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal get(Calendar HOUR_OF_DAY)) {
isRunning = true;
context log( 開始執(zhí)行指定任務 );
//TODO 添加自定義的詳細任務 以下只是示例
//系統(tǒng)定時接收郵件
Email email=new Email();
email recieve();
isRunning = false;
context log( 指定任務執(zhí)行結束 );
}
}
else {
context log( 上一次任務執(zhí)行還未結束 );
}
}
}
到這兒 ServletContextListener和MyTask的代碼都已完整了 最后一步就是把ServletContextListener部署到您的Web工程中去 在您工程的web xml配置文件中加入如下三行
listener
listener class test ContextListener/listener class
/listener
lishixinzhi/Article/program/Java/hx/201311/26421
我是讓它每10毫秒掃描一下。
Calendar ca=null;
Calendar ca1=null;
Timer timer=new Timer();
static Connection con=null;
public void chu(){
ca=Calendar.getInstance();
ca1=(Calendar)ca.clone();
ca1.add(Calendar.SECOND, 20);
}
public void Time(){
float s=ca1.get(Calendar.SECOND)-ca.get(Calendar.SECOND)+(ca1.get(Calendar.MILLISECOND)-ca.get(Calendar.MILLISECOND))/1000f;
if(con==null){
System.out.println("耗時"+String.valueOf(s)+"秒");
if(ca.after(ca1)){
System.out.println("取不到連接");
timer.cancel();
return ;
}
}else{
System.out.println("耗時"+String.valueOf(s)+"秒");
}
ca.add(Calendar.MILLISECOND, 10);
timer.schedule(
new TimerTask() {
public void run() {
System.out.println("時間在溜走。。。。");
Time();
}
}, ca.getTime());
}
void getcon(){
Connection con=null;//獲取Connection
chu();
Time();
}
指定定時任務的代碼如下:
public void schedule(TimerTask task,Date time)
比如,我們希望定時任務2006年7月2日0時0分執(zhí)行,只要給第二個參數傳一個時間設置為2006年7月2日0時0分的Date對象就可以了.
有一種情況是,可能我們的程序啟動的時候,已經是2006年7月3日了,這樣的話,程序一啟動,定時任務就開始執(zhí)行了.
schedule最后一個重載的方法是
public void schedule(TimerTask task,Date firstTime,long period)
既然號稱是定時任務,我們肯定希望由我們來指定任務指定的時間,顯然上面的方法就不中用了,因為我們不知道程序什么時間開始運行,就沒辦法確定需要延時多少.沒關系,schedule四個重載的方法還沒用完呢.用下面這個就OK了。
import?java.io.IOException;
import?java.util.Timer;
public?class?TimerTest?{
public?static?void?main(String[]?args)?{
Timer?timer?=?new?Timer();
timer.schedule(new?MyTask(),?1000,?2000);//?在1秒后執(zhí)行此任務,每次間隔2秒,如果傳遞一個Data參數,就可以在某個固定的時間執(zhí)行這個任務.
while?(true)?{//?這個是用來停止此任務的,否則就一直循環(huán)執(zhí)行此任務了
try?{
int?ch?=?System.in.read();
if?(ch?-?'c'?==?0)?{
timer.cancel();//?使用這個方法退出任務
}
}?catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
}
static?class?MyTask?extends?java.util.TimerTask?{
@Override
public?void?run()?{
//?TODO?Auto-generated?method?stub
System.out.println("________");
}
}
}
這段代碼基本能滿足你需求了 你還有需求就在上面再套一層job 當然如過太復雜了而且這種定時需求很多的話 建議用quartz框架 使用很簡單
網頁標題:java中定時器實例代碼 java中定時器實例代碼是什么
網頁鏈接:http://www.muchs.cn/article6/doociig.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供移動網站建設、網站排名、網站設計公司、動態(tài)網站、建站公司、小程序開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)