定時器類Timer在java
util包中
使用時
先實例化
然後使用實例的schedule(TimerTask task
long delay)方法
設定指定的任務task在指定的延遲delay後執行
定時器任務類TimerTask是抽象類
繼承並重寫其run()方法
可實現具體任務
schedule(TimerTask task
Date time)設定指定任務task在指定時間time執行
cancel()方法結束這個定時器
schedule(TimerTask task
long delay
long period)方法設定指定任務task在指定延遲delay後進行固定延遲peroid的執行
scheduleAtFixedRate(TimerTask task
long delay
long period)方法設定指定任務task在指定延遲delay後進行固定頻率peroid的執行
要實現一個定時任務
運用java中的Timer和TimerTask類可以非常容易實現實時調用處理函數
這兩個類使用起來非常方便
可以完成我們對定時器的絕大多數需要
看個簡單的例子
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()
)
//在
秒後執行此任務
每次間隔
秒
如果傳遞一個Data參數
就可以在某個固定的時間執行這個任務
while(true){//這個是用來停止此任務的
否則就一直循環執行此任務了
try {
int ch = System
in
read()
if(ch
c
==
){
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(
________
)
}
}
}
Servlet偵聽器結合Java定時器實現任務計劃調度[轉]
好多朋友用過Windows的任務計劃
也有不少程序迷自己曾寫過時鐘報警
系統自動關機等趣味程序
可卻很少有朋友在Web工程中實現過類似功能
今天有空把筆者先前曾在Tomcat上實現的類似功能
搬出來與大家共享
早在幾年前
我公司跟某市財政局合作項目開發
為加強財政局對所屬單位財務狀況的有效監管
開發
實施了財政局數據中心項目
此項目采用B/S加C/S混合結構模式
財政局Web服務器上架設數據同步接收裝置
由市屬單位每天下班前把財務信息通過HTTP協議上傳至財政局中心服務器
與Web服務器上的接收裝置對接
財政局內部各部門需要查閱大量財務信息
獲取完備的市屬單位當前財務狀況信息
各部門按職能劃分
需要准確的獲取各部門各自所關注的匯總信息
以財政報表的形式提供
因財政數據量大
實時計算財政報表速度較慢
當初就考慮用報表緩存來減輕服務器的負擔
但用緩存需要一個合理的緩存更新機制
考慮到各市屬單位每天下班前才把財務數據上傳
財政局每天所查看到的財務信息其實並不包括當天(除非有某位領導等到所屬單位全部上傳完之後才來查看信息
應該已經下班了)
所以要是能實現任務計劃調度
在每晚深夜把當天及歷史財務信息匯總
更新緩存
速度瓶頸不就解決了嗎
當時由於系統核心是基於Web部署的
報表計算引擎也相應的部署在Tomcat容器上
因此如果想要借用Windows的任務計劃來實現定時計算
就需要額外編寫普通桌面應用程序接口
稍顯復雜
於是就琢磨著想在Web上實現
經過查閱較多相關資料
發現Java定時器(java
util
Timer)有定時觸發計劃任務的功能
通過配置定時器的間隔時間
在某一間隔時間段之後會自動有規律的調用預先所安排的計劃任務(java
util
TimerTask)
另外
由於我們希望當Web工程啟動時
定時器能自動開始計時
在整個Web工程的生命期裡
定時器能在每晚深夜觸發一次報表計算引擎
因此定時器的存放位置也值得考查
不能簡單的存在於單個Servlet或JavaBean中
必須能讓定時器宿主的存活期為整個Web工程生命期
在工程啟動時能自動加載運行
結合這兩點
跟Servlet上下文有關的偵聽器就最合適不過了
通過在工程的配置文件中加以合理配置
會在工程啟動時自動運行
並在整個工程生命期中處於監聽狀態
下面就Servlet偵聽器結合Java定時器來講述整個實現過程
要運用Servlet偵聽器需要實現javax
servlet
ServletContextListener接口
同時實現它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個接口函數
考慮定時器有個建立和銷毀的過程
看了前面兩個接口函數
就不容置疑的把建立的過程置入contextInitialized
把銷毀的過程置入contextDestroyed了
我把ServletContextListener的實現類取名為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是自定義需要被調度的執行任務(在我的財政數據中心項目中就是報表計算引擎入口)
從java
util
TimerTask繼承
下面會重點講述
第三個參數表示每小時(即
*
*
毫秒)被觸發一次
中間參數
表示無延遲
其它代碼相當簡單
不再詳細說明
下面介紹MyTask的實現
上面的代碼中看到了在構造MyTask時
傳入了javax
servlet
ServletContext類型參數
是為記錄Servlet日志方便而傳入
因此需要重載MyTask的構造函數(其父類java
util
TimerTask原構造函數是沒有參數的)
在timer
schedule()的調度中
設置了每小時調度一次
因此如果想實現調度任務每
小時被執行一次
還需要判斷一下時鐘點
以常量C_SCHEDULE_HOUR表示(晚上
點
也即
點)
同時為防止
小時執行下來
任務還未執行完(當然
一般任務是沒有這麼長的)
避免第二次又被調度以引起執行沖突
設置了當前是否正在執行的狀態標志isRunning
示例代碼如下所示
private static final int C_SCHEDULE_HOUR =
;
private static boolean isRunning = false;
private ServletContext context = null;
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(
開始執行指定任務
)
//TODO 添加自定義的詳細任務
以下只是示例
int i =
;
while (i++ <
) {
context
log(
已完成任務的
+ i +
/
+
)
}
isRunning = false;
context
log(
指定任務執行結束
)
}
} else {
context
log(
上一次任務執行還未結束
)
}
}
上面代碼中
//TODO……
之下四行是真正被調度執行的演示代碼(在我的財政數據中心項目中就是報表計算過程)
您可以換成自己希望執行的語句
到這兒
ServletContextListener和MyTask的代碼都已完整了
最後一步就是把ServletContextListener部署到您的Web工程中去
在您工程的web
xml配置文件中加入如下三行
com
test
ContextListener
當然
上面的com
test得換成您自己的包名了
保存web
xml文件後
把工程打包部署到Tomcat中即可
任務會在每晚
點至凌晨
點之間被執行
上面的代碼會在Tomcat的日志文件中記錄如下
:
:
開始執行指定任務
:
:
已完成任務的
/
……
:
:
已完成任務的
/
:
:
指定任務執行結束
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25851.html