Quartz也常用在Web應用中,常見的是交由Spring托管的形式,但這里并非介紹這個。這里介紹Quartz在Web應用中單獨使用。我們看下本章的大綱:
(1)大體思路說明;
(2)新建一個Web Project;
(3)創(chuàng)建一個Job;
(4)創(chuàng)建一個ApplicationContextListener;
(5)常用的Cron Schedule;
接下來看下具體的內(nèi)容:
(1)大體思路說明;
一般來說,Web應用啟動時,應注冊已經(jīng)確定的定時任務;一些動態(tài)的、未確定觸發(fā)時間的定時任務,后續(xù)可通過靜態(tài)的Scheduler注冊。
所以我們創(chuàng)建一個Web項目,在ServerContextListener初始化的時候,添加我們的定時定時任務調(diào)度器,在銷毀的時候,關(guān)閉任務調(diào)度器。
(2)新建一個Web Project;
新建一個web maven project。
在pom.xml文件中添加依賴:
<groupId>org.quartz-scheduler<span class="hljs-name"groupId>
<artifactId>quartz<span class="hljs-name"artifactId>
<version>2.2.3<span class="hljs-name"version>
javax.servlet
servlet-api
3.1-b02
(3)創(chuàng)建一個Job;
創(chuàng)建一個實現(xiàn)Job類的Class取名為HelloJob,代碼如下:
package com.kfit.job;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
- 任務類.
- @author Angel --守護天使
- @version v.0.1
- @date 2017年4月21日
*/
**public **class HelloJob implements Job{
**public ****void** execute(JobExecutionContext context) **throws **JobExecutionException {
// 執(zhí)行響應的任務.
System. ***out*** .println("HelloJob.execute,"+**new** Date());
}
}
(4)創(chuàng)建一個ApplicationContextListener;
新建一個實現(xiàn)ServletContextListener的類ApplicationContextListener,代碼如下:
package com.kfit.job;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
@WebListener
**public **class ApplicationContextListener implements ServletContextListener{
**private** Scheduler scheduler = **null** ;
**public ****void** contextInitialized(ServletContextEvent arg0) {
**try** {
/*
*在 Quartz 中, scheduler 由 scheduler 工廠創(chuàng)建:DirectSchedulerFactory 或者 StdSchedulerFactory。第二種工廠 StdSchedulerFactory 使用較多,
*因為 DirectSchedulerFactory 使用起來不夠方便,需要作許多詳細的手工編碼設置。
*/
// 獲取Scheduler實例
scheduler = StdSchedulerFactory. *getDefaultScheduler* ();
scheduler.start();
System. ***out*** .println("scheduler.start");
System. ***out*** .println(scheduler.getSchedulerName());
//具體任務.
JobDetail jobDetail = JobBuilder. *newJob* (HelloJob. **class** ).withIdentity("job1","group1").build();
//觸發(fā)時間點. (每5秒執(zhí)行1次.)
SimpleScheduleBuilder simpleScheduleBuilder =SimpleScheduleBuilder. *simpleSchedule* ().withIntervalInSeconds(5).repeatForever();
Trigger trigger = TriggerBuilder. *newTrigger* ().withIdentity("trigger1","group1").startNow().withSchedule(simpleScheduleBuilder).build();
// 交由Scheduler安排觸發(fā)
scheduler.scheduleJob(jobDetail,trigger);
} **catch** (SchedulerException e) {
e.printStackTrace();
}
}
**public ****void** contextDestroyed(ServletContextEvent arg0) {
**try** {
scheduler.shutdown();
} **catch** (SchedulerException e) {
e.printStackTrace();
}//關(guān)閉定時任務調(diào)度器.
}
}
(5)常用的Cron Schedule;
相對于其他方式定義定時任務的觸發(fā)時間,我們較常用Cron Schedule:
// 具體任務
JobDetail job = JobBuilder.newJob(HelloJob. **class** ).withIdentity("job1", "group1").build();
// 觸發(fā)時間點
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 * * * * ? *");
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(cronScheduleBuilder).build();
// 交由Scheduler安排觸發(fā)
scheduler.scheduleJob(job, trigger);
-
Web
+關(guān)注
關(guān)注
2文章
1263瀏覽量
69492 -
Quartz
+關(guān)注
關(guān)注
0文章
7瀏覽量
7947 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14344
發(fā)布評論請先 登錄
相關(guān)推薦
評論