Quartz整合web專案(不基於spring)
阿新 • • 發佈:2019-02-05
Quartz
常用在Web應用中,常見的是交由Spring
託管的形式,但這裡並非介紹這個。這裡介紹Quartz在Web應用中單獨使用,如果對Quartz
還沒有基本的理解,可以參考我之前的博文:Quartz入門
假設現在你對Quartz已經有了初步的認識,那麼就來開啟你的Quartz之旅吧.
1.分析應用場景
一般來說,Web應用中,當我們需要執行某些定時操作時,就可以考慮使用我們強大的Quartz框架了.但是往往不會怎麼讓quartz單獨整合專案,並且網上很多資料都是介紹在spring中整合quartz來使用的
但是,在這裡不使用spring
,而是使用監聽器在應用啟動時註冊,記得在web.xml
2.步驟
步驟與之前Quartz入門很相似,導包,編寫相應的定時作業類都一樣,只是將之前編寫的test類
變為Listener
型別罷了
2.1新建Listener類
在相應的包下建立Listener類,記得勾上第一個選項
2.2編寫Scheduler
package com.quartz.main;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.quartz.job.*;
/**
* Application Lifecycle Listener implementation class
* ApplicationContextListener
*
*/
public class ApplicationContextListener implements ServletContextListener {
public static Scheduler scheduler = null;
/**
* Default constructor.
*/
public ApplicationContextListener() {
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
//關閉Web應用時,登出定時任務
public void contextDestroyed(ServletContextEvent arg0) {
try {
scheduler.shutdown();
System.out.println("scheduler.shutdown");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
//開啟Web應用時,開啟定時任務
public void contextInitialized(ServletContextEvent arg0) {
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
//在這裡我編寫了三個定時任務
JobDetail updataTheStatus = JobBuilder.newJob(updataTheStatus.class)
.withIdentity("updataTheStatus", "group1")
.build();
JobDetail updateTheRemainer = JobBuilder.newJob(updateTheRemainer.class)
.withIdentity("updateTheRemainer", "group2")
.build();
JobDetail deleteYstdayOrder = JobBuilder.newJob(deleteYstdayOrder.class)
.withIdentity("deleteYstdayOrder", "group3")
.build();
//三個觸發器
Trigger trigger1 = updateTheStatus();
Trigger trigger2 = updateTheRemainer();
Trigger trigger3 = deleteYstdayOrder();
//註冊
scheduler.scheduleJob(updataTheStatus, trigger1);
scheduler.scheduleJob(updateTheRemainer, trigger2);
scheduler.scheduleJob(deleteYstdayOrder, trigger3);
scheduler.start();
System.out.println("start");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//下面是定義三個觸發器的靜方法
public static Trigger updateTheStatus() {
//每一小時執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0/1 1/1 * ? "))
.startNow()
.build();
return trigger;
}
public static Trigger updateTheRemainer() {
//每天的00:00分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger2", "group2")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 1/1 * ? "))
.startNow()
.build();
return trigger;
}
public static Trigger deleteYstdayOrder() {
//每天的00:0分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger3", "group3")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 1/1 * ? "))
.startNow()
.build();
return trigger;
}
}
如果你不會Cron表示式,可以進去下面這個網站,它會根據你的要求生成相應表示式
2.3在web.xml註冊監聽器
<listener>
<listener-class>com.quartz.main.ApplicationContextListener</listener-class>
</listener>
在你的web.xml
中新增這段程式碼,當然路徑改成你編寫的Listener類
的路徑,如果最後一步沒有做的話,就前功盡棄了
3.總結
最近在忙著做web專案,需要使用到quartz框架,但是現在對quartz還不是瞭解的很深入,以後會進一步學習,也會不定時的更新這方面的內容,如果有興趣可以關注我的部落格<^_^>