第一種方法為常見且易於上手
1、在應用開發中,經常需要一些周期性的操作,比如每5分鐘執行某一操作
等。對於這樣的操作最方便、高效的實現方式就是使用java.util.Timer工具類。
private java.util.Timer timer;
timer
= new Timer(true);
timer.schedule(
new java.util.TimerTask() {
public void run() { //server.checkNewMail(); 要操作的方法 } }, 0, 5*60*1000);
第
一個參數是要操作的方法,第二個參數是要設定延遲的時間,第三個參數是周期的設定,每隔多長時間執行該操作。
使用這幾行代碼之後,Timer本身會每隔5分鐘調用一遍server.checkNewMail()方法,不需要自己啟動線程。Timer本身也是多線
程同步的,多個線程可以共用一個Timer,不需要外部的同步代碼。
2、
(1)Timer.schedule(TimerTask
task,Date time)安排在制定的時間執行指定的任務。
(2)Timer.schedule(TimerTask task,Date
firstTime ,long period)安排指定的任務在指定的時間開始進行重複的固定順延強制.
(3)Timer.schedule(TimerTask
task,long delay)安排在指定延遲後執行指定的任務.
(4)Timer.schedule(TimerTask
task,long delay,long period)安排指定的任務從指定的延遲後開始進行重複的固定順延強制.
(5)Timer.scheduleAtFixedRate(TimerTask
task,Date firstTime,long period)安排指定的任務在指定的時間開始進行重複的固定速率執行.
(6)Timer.scheduleAtFixedRate(TimerTask
task,long delay,long period)安排指定的任務在指定的延遲後開始進行重複的固定速率執行.如:Timer time= new Timer(true);//版本資訊上報 定時器
time
.schedule(new UploadVervsionDataImpl(ctx), 0,30*60*1000);//30分鐘上報一次描述:每30分鐘執行一次
UploadVervsionDataImpl(ctx)
public class UploadVervsionDataImpl extends TimerTask{
public static WebApplicationContext ctx;
public UploadVervsionDataImpl(WebApplicationContext ctx){
this.ctx=ctx;
}
@Override
public void run() {//1 擷取版本資訊 ; 2 向中心(webservice)上報
//要執行的方法
}}第二種方法Scheduler
首先添加所需要的類包:quartz-1.5.2.jar,quartz-all-1.5.2.jar,quartz-jboss-
1.5.2.jar
//設定定時作業
public
void startScheduler(HttpServletRequest requests)throws
SchedulerException{
try{
//建立作業調度器
Scheduler
scheduler = StdSchedulerFactory.getDefaultScheduler();
//判斷作業調度內是否有作業,如果有將其刪除
if (!scheduler.isShutdown()) {
scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
}
//刪除調度器的作業後,建立一個我們
現在要完成的作業,該作業所需要的類是ReceiveJobd.class,作業名字是ReceiveOnTimes,所屬分組是
Scheduler.DEFAULT_GROUP
JobDetail jobDetail = new JobDetail("ReceiveOnTimed",
Scheduler.DEFAULT_GROUP,
ReceiveJobd.class);
int m = ips.length;
int n = tablenames.length;
//向作業內設定要傳入的參數
jobDetail.getJobDataMap().put("scheduler",
scheduler);
jobDetail.getJobDataMap().put("ipLength", m);
jobDetail.getJobDataMap().put("tablenameLength", n);
jobDetail.getJobDataMap().put("wcx",wc);
for (int i
= 0; i < m; i++) {
jobDetail.getJobDataMap().put("ip" + i, ips[i]);
for
(int j = 0; j < n; j++) {
jobDetail.getJobDataMap().put("tablename" + j, tablenames[j]);
}
}
//
建立觸發器,判斷何時觸發該作業,參數為觸發器的名稱,觸發器分組,作業名稱,作業分組,時間設定
Trigger trigger = new
CronTrigger("ReceiverOnTimeTriggerd",
scheduler.DEFAULT_GROUP,
"ReceiveOnTimed",
scheduler.DEFAULT_GROUP, time);
//將作業和觸發器添加到調度器
scheduler.scheduleJob(jobDetail,
trigger);
//
按照設定開始調度
scheduler.start();
}catch(Exception
e){
e.printStackTrace();
}
}
具體作業類的處理:
package
com.bodhiya.schsystem.business;
import org.quartz.Job;
import
org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import
org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import
org.springframework.web.context.WebApplicationContext;
public class ReceiveJobd implements Job{
public void
ReceiveJobd(){
}
//作業具體實現的
功能
public void execute(JobExecutionContext
context) throws
JobExecutionException {
try {
//建立JobDataMap對象,
用來接收傳遞的參數
JobDataMap
dataMap = context.getMergedJobDataMap();
int
ipLength = dataMap.getInt("ipLength");
int
tablenameLength = dataMap.getInt("tablenameLength");
WebApplicationContext
wc=(WebApplicationContext)dataMap.get("wcx");
String ip = "";
String tablename = "";
for (int i = 0; i < ipLength; i++) {
ip =
dataMap.getString("ip" + i);
for (int j = 0; j <
tablenameLength; j++) {
tablename =
dataMap.getString("tablename" + j);
ExchangeAccess ea=new ExchangeAccess(ip,tablename,wc);
//啟動線程
ea.start();
}
}
Scheduler scheduler = (Scheduler)
dataMap.get("scheduler");
scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}