maven quartz

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代替

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值