springmvc结合quartz实现定时任务

一、问题背景 

在我们实际开发项目的过程中,经常需要在某一个时刻自动触发一个任务定时提取一些业务数据或者报表。比如,客户希望在每天晚上的某个时点将业务数据提取到某一个表中,并且生成新的报表。基于这种情况,我们使用quartz来实现任务的自动运行 

二、代码实现 

任务监听类:TaskFilter.java 

Java代码 
  1. import java.text.SimpleDateFormat;  
  2. import java.util.ArrayList;  
  3. import java.util.Date;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.   
  7. import org.quartz.CronTrigger;  
  8. import org.quartz.JobDataMap;  
  9. import org.quartz.JobDetail;  
  10. import org.quartz.Scheduler;  
  11. import org.quartz.SchedulerException;  
  12. import org.quartz.SchedulerFactory;  
  13. import org.quartz.impl.StdSchedulerFactory;  
  14. import org.springframework.beans.factory.InitializingBean;  
  15. import org.springframework.expression.ParseException;  
  16. import org.springframework.stereotype.Repository;  
  17.   
  18. import com.ssm.job.domain.JobPlanDomain;  
  19.   
  20. @Repository("taskFilter")  
  21. public class TaskFilter implements InitializingBean {  
  22.   
  23.     // 0 0 12 * * ? 每天12点整触发一次  
  24.     // 0 15 10 ? * * 每天10点15分触发一次  
  25.     // 0 15 10 * * ? 每天10点15分触发一次  
  26.     // 0 15 10 * * ? * 每天10点15分触发一次  
  27.     // 0 15 10 * * ? 2005 2005年内每天10点15分触发一次  
  28.     // 0 * 14 * * ? 每天的2点整至2点59分,每分钟触发一次  
  29.     // 0 0/5 14 * * ? 每天的2点整至2点55分,每5分钟触发一次  
  30.     // 0 0/5 14,18 * * ? 每天的2点整至2点55分以及18点整至18点55分,每5分钟触发一次  
  31.     // 0 0-5 14 * * ? 每天的2点整至2点5分,每分钟触发一次  
  32.     // 0 10,44 14 ? 3 WED 每年3月的每个星期三的2点10分以及2点44分触发一次  
  33.     // 0 15 10 ? * MON-FRI 每月周一、周二、周三、周四、周五的10点15分触发一次  
  34.     // 0 15 10 15 * ? 每月15的10点15分触发一次  
  35.     // 0 15 10 L * ? 每月最后一天的10点15分触发一次  
  36.     // 0 15 10 ? * 6L 每月最后一个周五的10点15分触发一次  
  37.     // 0 15 10 ? * 6L 每月最后一个周五的10点15分触发一次  
  38.     // 0 15 10 ? * 6L 2002-2005 2002年至2005年间,每月最后一个周五的10点15分触发一次  
  39.     // 0 15 10 ? * 6#3 每月第三个周五的10点15触发一次  
  40.     // 0 0 12 1/5 * ? 每月1号开始,每5天的12点整触发一次  
  41.     //  
  42.     // 0 11 11 11 11 ? 每年11月11日11点11分触发一次  
  43.     /** 
  44.      * 容器启动时初始化该类时,将任务都加到内存当中 
  45.      *  
  46.      * @throws SchedulerException 
  47.      * @throws ParseException 
  48.      */  
  49.     public void initJobTrigger() throws SchedulerException, ParseException {  
  50.   
  51.         SchedulerFactory schedulerFactory = new StdSchedulerFactory();  
  52.         Scheduler scheduler = schedulerFactory.getScheduler();  
  53.         // 这里可以读取数据库来设置各个任务  
  54.         List list = new ArrayList();  
  55.         JobPlanDomain t1 = new JobPlanDomain();  
  56.         t1.setCronExpression("* * * * * ?");  
  57.         t1.setValid("0");  
  58.         t1.setJobPlanCode("222222222222");  
  59.         list.add(t1);  
  60.   
  61.         if (null != list && list.size() > 0) {  
  62.             Iterator ite = list.iterator();  
  63.             while (ite.hasNext()) {  
  64.                 // 任务对象  
  65.                 JobPlanDomain rj = (JobPlanDomain) ite.next();  
  66.                 // 任务表达式  
  67.                 String cronExpression = rj.getCronExpression();  
  68.                 // 新建任务,任务组为默认的Scheduler.DEFAULT_GROUP,需要执行的任务类为TaskReport.class  
  69.                 JobDetail jobDetail = new JobDetail("reportJob_" + rj.getJobPlanCode(), Scheduler.DEFAULT_GROUP, TaskReport.class);  
  70.                 // 新建触发器,触发器为默认的Scheduler.DEFAULT_GROUP  
  71.                 CronTrigger cronTrigger = new CronTrigger("trigger_" + rj.getJobPlanCode(), Scheduler.DEFAULT_GROUP);  
  72.                 JobDataMap jobDataMap = new JobDataMap();  
  73.                 jobDataMap.put("managecom""8611");  
  74.                 jobDataMap.put("wageno""201409");  
  75.                 jobDetail.setJobDataMap(jobDataMap);  
  76.   
  77.                 try {  
  78.                     // 为触发器设置定时表达式  
  79.                     cronTrigger.setCronExpression(cronExpression);  
  80.                     String startTime = "2014-10-17 16:17:10";  
  81.                     String endTime = "2014-10-17 16:17:50";  
  82.                     SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  83.                     Date startDate = sdf.parse(startTime);  
  84.                     Date endDate = sdf.parse(endTime);  
  85.                     if(startTime.compareTo(endTime) > 0 ) {  
  86.                         throw new Exception("起始时间比结束时间大!");  
  87.                     }  
  88.                       
  89.                     cronTrigger.setStartTime(startDate);  
  90.                     cronTrigger.setEndTime(endDate);  
  91.                     // 启动新增定时器任务  
  92.                     scheduler.scheduleJob(jobDetail, cronTrigger);  
  93.                       
  94.                 } catch (Exception e) {  
  95.                     // 启动验证失败,设置任务标记为禁用  
  96.                     e.printStackTrace();  
  97.                     rj.setValid("1");  
  98.                     // baseDao.updateObject(rj);  
  99.                 }  
  100.             }  
  101.         }  
  102.         // 初始化任务只需要执行一次,执行一次后移除初始化触发器  
  103.         scheduler.unscheduleJob("InitTrigger", Scheduler.DEFAULT_GROUP);  
  104.         // 任务启动  
  105.         scheduler.start();  
  106.     }  
  107.   
  108.       
  109.     public static void main(String[] args) {  
  110.         TaskFilter t = new TaskFilter();  
  111.         try {  
  112.             t.initJobTrigger();  
  113.         } catch (ParseException e) {  
  114.             // TODO Auto-generated catch block  
  115.             e.printStackTrace();  
  116.         } catch (SchedulerException e) {  
  117.             // TODO Auto-generated catch block  
  118.             e.printStackTrace();  
  119.         }  
  120.     }  
  121.   
  122.   
  123.   
  124.     @Override  
  125.     public void afterPropertiesSet() throws Exception {  
  126.         try {  
  127.             this.initJobTrigger();  
  128.         } catch (ParseException e) {  
  129.             // TODO Auto-generated catch block  
  130.             e.printStackTrace();  
  131.         } catch (SchedulerException e) {  
  132.             // TODO Auto-generated catch block  
  133.             e.printStackTrace();  
  134.         }  
  135.           
  136.     }  
  137. }  



任务计划类:JobPlanDomain.java 
Java代码 
  1. public class JobPlanDomain {  
  2.   
  3.     //任务编号  
  4.     private String jobCode;  
  5.     //任务计划编号  
  6.     private String jobPlanCode;  
  7.     //任务启动时间表达式  
  8.     private String cronExpression;  
  9.     //任务启动状态 0 未启动 1 启动  
  10.     private String runState;  
  11.     //任务是否有效 0 有效 1 无效  
  12.     private String valid;  
  13.     //任务参数  
  14.     private String paramMap;  
  15.     //任务执行次数  
  16.     private int count;  
  17.     //下次任务启动时间,适用于任务启动多次  
  18.     private String nextRunTime;  
  19.     //任务开始时间  
  20.     private String startDateTime;  
  21.     //任务结束时间  
  22.     private String endDateTime;  
  23.     //执行频率,1、每天一次 2、每年一次 3、每小时一次  4、每周一次    
  24.     private int frequence;  
  25.     //任务运行的节点和端口号  
  26.     private String ip;  
  27.     //任务定制人  
  28.     private String operator;  
  29.     //任务定制日期  
  30.     private String makeDate;  
  31.     //任务定制时间  
  32.     private String makeTime;  
  33.     //任务修改日期  
  34.     private String modifyDate;  
  35.     //任务修改时间  
  36.     private String modifyTime;  
  37.       
  38.     public String getJobCode() {  
  39.         return jobCode;  
  40.     }  
  41.     public void setJobCode(String jobCode) {  
  42.         this.jobCode = jobCode;  
  43.     }  
  44.     public String getJobPlanCode() {  
  45.         return jobPlanCode;  
  46.     }  
  47.     public void setJobPlanCode(String jobPlanCode) {  
  48.         this.jobPlanCode = jobPlanCode;  
  49.     }  
  50.     public String getCronExpression() {  
  51.         return cronExpression;  
  52.     }  
  53.     public void setCronExpression(String cronExpression) {  
  54.         this.cronExpression = cronExpression;  
  55.     }  
  56.     public String getValid() {  
  57.         return valid;  
  58.     }  
  59.     public void setValid(String valid) {  
  60.         this.valid = valid;  
  61.     }  
  62.     public int getCount() {  
  63.         return count;  
  64.     }  
  65.     public void setCount(int count) {  
  66.         this.count = count;  
  67.     }  
  68.     public String getStartDateTime() {  
  69.         return startDateTime;  
  70.     }  
  71.     public void setStartDateTime(String startDateTime) {  
  72.         this.startDateTime = startDateTime;  
  73.     }  
  74.     public String getEndDateTime() {  
  75.         return endDateTime;  
  76.     }  
  77.     public void setEndDateTime(String endDateTime) {  
  78.         this.endDateTime = endDateTime;  
  79.     }  
  80.     public String getIp() {  
  81.         return ip;  
  82.     }  
  83.     public void setIp(String ip) {  
  84.         this.ip = ip;  
  85.     }  
  86.     public String getOperator() {  
  87.         return operator;  
  88.     }  
  89.     public void setOperator(String operator) {  
  90.         this.operator = operator;  
  91.     }  
  92.     public String getMakeDate() {  
  93.         return makeDate;  
  94.     }  
  95.     public void setMakeDate(String makeDate) {  
  96.         this.makeDate = makeDate;  
  97.     }  
  98.     public String getMakeTime() {  
  99.         return makeTime;  
  100.     }  
  101.     public void setMakeTime(String makeTime) {  
  102.         this.makeTime = makeTime;  
  103.     }  
  104.     public String getModifyDate() {  
  105.         return modifyDate;  
  106.     }  
  107.     public void setModifyDate(String modifyDate) {  
  108.         this.modifyDate = modifyDate;  
  109.     }  
  110.     public String getModifyTime() {  
  111.         return modifyTime;  
  112.     }  
  113.     public void setModifyTime(String modifyTime) {  
  114.         this.modifyTime = modifyTime;  
  115.     }  
  116.     public String getNextRunTime() {  
  117.         return nextRunTime;  
  118.     }  
  119.     public void setNextRunTime(String nextRunTime) {  
  120.         this.nextRunTime = nextRunTime;  
  121.     }  
  122.     public void setParamMap(String paramMap) {  
  123.         this.paramMap = paramMap;  
  124.     }  
  125.     public String getRunState() {  
  126.         return runState;  
  127.     }  
  128.     public void setRunState(String runState) {  
  129.         this.runState = runState;  
  130.     }  
  131.     public int getFrequence() {  
  132.         return frequence;  
  133.     }  
  134.     public void setFrequence(int frequence) {  
  135.         this.frequence = frequence;  
  136.     }  
  137.     public String getParamMap() {  
  138.         return paramMap;  
  139.     }  
  140.       
  141. }  


任务实现类:TaskReport.java 

Java代码 
  1. import java.util.Iterator;  
  2. import java.util.Set;  
  3.   
  4. import org.quartz.Job;  
  5. import org.quartz.JobDataMap;  
  6. import org.quartz.JobDetail;  
  7. import org.quartz.JobExecutionContext;  
  8. import org.quartz.JobExecutionException;  
  9.   
  10. public class TaskReport implements Job {  
  11.   
  12.     /**   
  13.      * 报表生成任务   
  14.      */   
  15.     @Override  
  16.     public void execute(JobExecutionContext je) throws JobExecutionException {     
  17.         System.out.println(je.getJobDetail().getKey());  
  18.         System.out.println(je.getJobDetail().getJobClass());  
  19.           
  20.         JobDetail jobDetail = je.getJobDetail();  
  21.         JobDataMap jobData = jobDetail.getJobDataMap();  
  22.         Set tjobSet =  jobData.keySet();  
  23.         Iterator tIterator = tjobSet.iterator();  
  24.         while(tIterator.hasNext()) {  
  25.             String key = (String)tIterator.next();  
  26.             System.out.println(jobData.get(key));  
  27.         }  
  28.     }    
  29. }  



三、将quartz.properties放到web工程classpath中 

quartz.properties: 
Java代码 
  1. #============================================================================  
  2. # Configure Main Scheduler Properties    
  3. #============================================================================  
  4. org.quartz.scheduler.instanceName = DefaultQuartzScheduler  
  5. org.quartz.scheduler.instanceId = AUTO  
  6. org.quartz.scheduler.rmi.export = false  
  7. org.quartz.scheduler.rmi.proxy = false  
  8. org.quartz.scheduler.wrapJobExecutionInUserTransaction = false  
  9.   
  10.   
  11. #============================================================================  
  12. # Configure ThreadPool    
  13. #============================================================================  
  14. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  15. org.quartz.threadPool.threadCount = 10  
  16. org.quartz.threadPool.threadPriority = 5  
  17. #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true  
  18.   
  19.   
  20. #============================================================================  
  21. # Configure JobStore    
  22. #============================================================================  
  23. #org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
  24. #org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate  
  25. org.quartz.jobStore.misfireThreshold = 60000  
  26. #org.quartz.jobStore.useProperties = false  
  27. #org.quartz.jobStore.tablePrefix = QRTZ_  
  28. #org.quartz.jobStore.dataSource = myDS  
  29.   
  30.   
  31. #org.quartz.jobStore.isClustered = true  
  32. #org.quartz.jobStore.clusterCheckinInterval = 15000  
  33.   
  34.   
  35. #============================================================================  
  36. # Configure DataSource  
  37. #============================================================================  
  38. #org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver  
  39. #org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/test  
  40. #org.quartz.dataSource.myDS.user = root  
  41. #org.quartz.dataSource.myDS.password = root  
  42. #org.quartz.dataSource.myDS.maxConnections = 10  


四、运行类TaskFilter.java 

运行前请修改TaskFilter.java中的时间。 

控制台会依次打印出: 

DEFAULT.reportJob_222222222222 
class com.ssm.job.TaskReport 
201409 
8611
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值