电子说
Quartz也常用在Web应用中,常见的是交由Spring托管的形式,但这里并非介绍这个。这里介绍Quartz在Web应用中单独使用。我们看下本章的大纲:
(1)大体思路说明;
(2)新建一个Web Project;
(3)创建一个Job;
(4)创建一个ApplicationContextListener;
(5)常用的Cron Schedule;
接下来看下具体的内容:
(1)大体思路说明;
一般来说,Web应用启动时,应注册已经确定的定时任务;一些动态的、未确定触发时间的定时任务,后续可通过静态的Scheduler注册。
所以我们创建一个Web项目,在ServerContextListener初始化的时候,添加我们的定时定时任务调度器,在销毁的时候,关闭任务调度器。
(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)创建一个Job;
创建一个实现Job类的Class取名为HelloJob,代码如下:
package com.kfit.job;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
*/
**public **class HelloJob implements Job{
**public ****void** execute(JobExecutionContext context) **throws **JobExecutionException {
// 执行响应的任务.
System. ***out*** .println("HelloJob.execute,"+**new** Date());
}
}
(4)创建一个ApplicationContextListener;
新建一个实现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 工厂创建: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();
//触发时间点. (每5秒执行1次.)
SimpleScheduleBuilder simpleScheduleBuilder =SimpleScheduleBuilder. *simpleSchedule* ().withIntervalInSeconds(5).repeatForever();
Trigger trigger = TriggerBuilder. *newTrigger* ().withIdentity("trigger1","group1").startNow().withSchedule(simpleScheduleBuilder).build();
// 交由Scheduler安排触发
scheduler.scheduleJob(jobDetail,trigger);
} **catch** (SchedulerException e) {
e.printStackTrace();
}
}
**public ****void** contextDestroyed(ServletContextEvent arg0) {
**try** {
scheduler.shutdown();
} **catch** (SchedulerException e) {
e.printStackTrace();
}//关闭定时任务调度器.
}
}
(5)常用的Cron Schedule;
相对于其他方式定义定时任务的触发时间,我们较常用Cron Schedule:
// 具体任务
JobDetail job = JobBuilder.newJob(HelloJob. **class** ).withIdentity("job1", "group1").build();
// 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 * * * * ? *");
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(cronScheduleBuilder).build();
// 交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
全部0条评论
快来发表一下你的评论吧 !