1. 程式人生 > >Quartz整合web專案(不基於spring)

Quartz整合web專案(不基於spring)

Quartz常用在Web應用中,常見的是交由Spring託管的形式,但這裡並非介紹這個。這裡介紹Quartz在Web應用中單獨使用,如果對Quartz還沒有基本的理解,可以參考我之前的博文:Quartz入門

假設現在你對Quartz已經有了初步的認識,那麼就來開啟你的Quartz之旅吧.

1.分析應用場景

一般來說,Web應用中,當我們需要執行某些定時操作時,就可以考慮使用我們強大的Quartz框架了.但是往往不會怎麼讓quartz單獨整合專案,並且網上很多資料都是介紹在spring中整合quartz來使用的
但是,在這裡不使用spring,而是使用監聽器在應用啟動時註冊,記得在web.xml

註冊這個監聽器哦(>_<);在關閉Web應用時,也要相應的登出定時任務。

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還不是瞭解的很深入,以後會進一步學習,也會不定時的更新這方面的內容,如果有興趣可以關注我的部落格<^_^>