pom.xml
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
quartz.properties 放到resources,没有此文件也可运行
#指定调度器的名称
org.quartz.scheduler.instanceName = MyScheduler
#线程池中最多同时有多少个线程运行,默认是10
org.quartz.threadPool.threadCount = 10
#指定Quartz的数据(job及trigger信息)存储位置,RamJobStore指内存
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
quartz.xml 自定义的job配置文件,放到resource下,可将所有的job配置到该文件中,最后由调度器统一调用
<?xml version="1.0" encoding="UTF-8"?>
<jobs>
<job>
<type>simple</type>
<class>com.***.SimpleSampleJob</class>
<id>simple-1</id>
<group>sample</group>
<interval>120000</interval>
</job>
<job>
<type>cron</type>
<class>com.***.CronSampleJob</class>
<id>cron-1</id>
<group>sample</group>
<interval>0 */1 * * * ?</interval>
<!-- miss fire handling 1 do nothing 2 fire and process 3 ignore,default is 2 -->
<missfirehandling>2</missfirehandling>
</job>
</jobs>
Job
simpleJob
public class SimpleSampleJob implements Job{
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
//Date preFireTime = jec.getTrigger().getPreviousFireTime();
Date nextFireTime = jec.getTrigger().getNextFireTime();
System.out.println("Simple Job exe at "+(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))+",interval:"+(nextFireTime.getTime()-System.currentTimeMillis())+"....");
}
}
cronJob
public class CronSampleJob implements Job{
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
//Date preFireTime = jec.getTrigger().getPreviousFireTime();
Date nextFireTime = jec.getTrigger().getNextFireTime();
System.out.println("Cron Job exe at "+(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))+",interval:"+(nextFireTime.getTime()-System.currentTimeMillis())+"....");
}
}
servletListener
package com.****;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.regex.Pattern;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.quartz.CronScheduleBuilder;
import org.quartz.Job;
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;
import com.***.utils.Log;
public class JobListener implements ServletContextListener{
private Scheduler scheduler = null ;
@SuppressWarnings("unchecked")
@Override
public void contextInitialized(ServletContextEvent sce) {
try{
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
String path = sce.getServletContext().getInitParameter("quartz");
InputStream is = JobListener.class.getResourceAsStream((path==null || path.trim().equals(""))?"/quartz-job.xml":path);
if(is!=null){
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(is);
List<Element> jobEleList = (List<Element>)doc.getRootElement().getChildren();
String jobType = "";
String jobClass = "";
String jobId = "";
String jobGroup = "";
String jobInterval = "";
String jobMissfireHandling = "";
int idx = 0 ;
//JobDetail job = null;
java.util.regex.Pattern regex = Pattern.compile("^[0-9]{4,8}$");
for(Element ele:jobEleList){
jobType = ele.getChildText("type");
jobClass = ele.getChildText("class");
jobId = ele.getChildText("id");
jobGroup = ele.getChildText("group");
jobInterval = ele.getChildText("interval");
jobMissfireHandling = ele.getChildText("missfirehandling");
jobId = (jobId==null || jobId.trim().length()==0)?("tmpid"+idx++):jobId;
jobGroup = (jobGroup==null || jobGroup.trim().length()==0)?("tmpgroup"+idx++):jobGroup;
//miss fire handling 1 do nothing 2 fire and process 3 ignore
jobMissfireHandling = (jobMissfireHandling==null || jobMissfireHandling.trim().length()==0)?"2":jobMissfireHandling;
switch(jobType){
case "simple":
if(jobInterval==null || !regex.matcher(jobInterval).matches()){
Log.error("Job["+jobClass+"] interval error");
}else{
try {
Class<?> c = Class.forName(jobClass);
JobDetail job = JobBuilder.newJob((Class<? extends Job>) c).withIdentity(jobId, jobGroup).build();
SimpleScheduleBuilder ssb = SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(Long.parseLong(jobInterval)).repeatForever();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobId, jobGroup).startNow().withSchedule(ssb).build();
scheduler.scheduleJob(job,trigger);
}catch(ClassNotFoundException ex){
Log.error("Job["+jobClass+"] class not found");
}catch(SchedulerException ex){
Log.error("Job["+jobClass+"] schedule error:"+ex.getMessage());
}
}
break;
case "cron":
if(!"1".equals(jobMissfireHandling) && !"2".equals(jobMissfireHandling) && !"3".equals(jobMissfireHandling)){
Log.error("Job["+jobClass+"] missfirehandling element value error,support value include 1,2,3");
}else{
try {
Class<?> c = Class.forName(jobClass);
JobDetail job = JobBuilder.newJob((Class<? extends Job>) c).withIdentity(jobId, jobGroup).build();
CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule(jobInterval);
switch(jobMissfireHandling){
case "1":
csb.withMisfireHandlingInstructionDoNothing();
break;
case "2":
csb.withMisfireHandlingInstructionFireAndProceed();
break;
case "3":
csb.withMisfireHandlingInstructionIgnoreMisfires();
break;
default:
}
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobId, jobGroup).startNow().withSchedule(csb).build();
scheduler.scheduleJob(job,trigger);
}catch(ClassNotFoundException ex){
Log.error("Job["+jobClass+"] class not found");
}catch(SchedulerException ex){
Log.error("Job["+jobClass+"] schedule error:"+ex.getMessage());
}
}
break;
default:
Log.error("Job type error,support type include simple and cron");
}
}
}else{
Log.error("Quartz Configure File Not Found.");
}
}catch(SchedulerException ex){
Log.error(ex);
} catch (JDOMException e) {
Log.error(e);
} catch (IOException e) {
Log.error(e);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
try {
// 关闭Scheduler
scheduler.shutdown();
Log.trace("The scheduler shutdown...");
} catch (SchedulerException se) {
Log.error(se);
}
}
将listener配置到web.xml中,以实现应用启动后启动定时
web.xml
<context-param>
<description>quartz configure file path,default is quartz-job.xml</description>
<param-name>quartz</param-name>
<param-value>/quartz-job.xml</param-value>
</context-param>
<listener>
<listener-class>com.****.JobListener</listener-class>
</listener>
注:代码中的Log可参见http://blog.csdn.net/junandjun/article/details/52777785
或用System.out.println代替