Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

由于公司的新接得项目要实现一批数据的同步,通过外围厂商提供的一系列各个系统的webervices接口定时将数据同步到我们开发的共享平台上,由于厂商系统的数据是不断在变化以及各系统闲忙时的特点,所以定时同步任务的执行必须在时间上能够动态配置。因此,我们需要动态的从数据库中获取配置信息,以改变各个定时间的执行规则,废话不说了,上代码:(我利用的是ssh框架直接写的,框架搭建不再叙述)

1.创建数据表(我用的是mysql)

[sql]  view plain  copy
  1. DROP TABLE IF EXISTS `t_wsdoc`;  
  2. CREATE TABLE `t_wsdoc` (  
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `triggername` varchar(50) NOT NULL,  
  5.   `jobdetailname` varchar(50) NOT NULL,  
  6.   `cronexpression` varchar(50) NOT NULL,  
  7.   `targetobject` varchar(50) NOT NULL,  
  8.   `methodname` varchar(50) NOT NULL,  
  9.   `concurrent` char(10) NOT NULL DEFAULT '0',  
  10.   `state` char(10) NOT NULL DEFAULT '1',  
  11.   `isspringbean` char(10) NOT NULL DEFAULT '0',  
  12.   `readme` varchar(100) DEFAULT NULL,  
  13.   `reserved1` varchar(50) DEFAULT NULL,  
  14.   `reserved2` varchar(50) DEFAULT NULL,  
  15.   `reserved3` varchar(50) DEFAULT NULL,  
  16.   `reserved4` varchar(50) DEFAULT NULL,  
  17.   `reserved5` varchar(50) DEFAULT NULL,  
  18.   `reserved6` varchar(50) DEFAULT NULL,  
  19.   `reserved7` varchar(50) DEFAULT NULL,  
  20.   `reserved8` varchar(50) DEFAULT NULL,  
  21.   `reserved9` varchar(50) DEFAULT NULL,  
  22.   `reserved10` varchar(50) DEFAULT NULL,  
  23.   PRIMARY KEY (`id`)  
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
[sql]  view plain  copy
  1. INSERT INTO `t_wsdoc` VALUES ('1''triggername''detailname''0/5 * * * * ?''com.framework.timer.ISCSynAllData''run''\'0\'''\'1\'''\'0\'''说明'nullnullnullnullnullnullnullnullnullnull);  

2.创建表对应的实体类

[java]  view plain  copy
  1. package ...自定义;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.GenerationType;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.SequenceGenerator;  
  9. import javax.persistence.Table;  
  10.   
  11. import com.framework.model.AbstractEntity;  
  12.   
  13.   
  14. @Entity  
  15. @Table(name = "WSDOC", schema = "")  
  16. public class Wsdoc extends AbstractEntity{  
  17.   
  18.     /** 
  19.      *  
  20.      */  
  21.     private static final long serialVersionUID = 1L;  
  22.     private Long id;  
  23.     // 设置trigger名称  
  24.     private String triggername;    
  25.     //设置表达式  
  26.     private String cronexpression;  
  27.     // 设置Job名称  
  28.     private String jobdetailname;  
  29.     //任务类名  
  30.     private String targetobject;  
  31.     //类名对应的方法名  
  32.     private String methodname;  
  33.     //设置是否并发启动任务 0是false 非0是true  
  34.     private String concurrent;  
  35.     // 如果计划任务不存则为1 存在则为0  
  36.     private String state;  
  37.     private String readme;  
  38.     //是否是已经存在的springBean 1是  0 否  
  39.     private String isspringbean;  
  40.     /** 预留字段1 */  
  41.     private String reserved1;  
  42.     /** 预留字段2 */  
  43.     private String reserved2;  
  44.     /** 预留字段3 */  
  45.     private String reserved3;  
  46.     /** 预留字段4 */  
  47.     private String reserved4;  
  48.     /** 预留字段5 */  
  49.     private String reserved5;  
  50.     /** 预留字段6 */  
  51.     private String reserved6;  
  52.     /** 预留字段7 */  
  53.     private String reserved7;  
  54.     /** 预留字段8 */  
  55.     private String reserved8;  
  56.     /** 预留字段9 */  
  57.     private String reserved9;  
  58.     /** 预留字段10 */  
  59.     private String reserved10;  
  60.     // Constructors  
  61.   
  62.     /** default constructor */  
  63.     public Wsdoc() {  
  64.     }  
  65.   
  66.     /** full constructor */  
  67.     public Wsdoc(String triggername, String cronexpression,  
  68.             String jobdetailname, String targetobject, String methodname,  
  69.             String concurrent, String state, String readme,String isspringbean) {  
  70.         this.triggername = triggername;  
  71.         this.cronexpression = cronexpression;  
  72.         this.jobdetailname = jobdetailname;  
  73.         this.targetobject = targetobject;  
  74.         this.methodname = methodname;  
  75.         this.concurrent = concurrent;  
  76.         this.state = state;  
  77.         this.readme = readme;  
  78.         this.isspringbean=isspringbean;  
  79.     }  
  80.     @Id  
  81.     @Column(name = "ID", unique = true, nullable = false, precision = 10, scale = 0)  
  82.     //@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="WSDOC_ID") //如果为oracle则可以创建一个序列,便于插入数据用  
  83.     //@SequenceGenerator(initialValue=0,name="WSDOC_ID",sequenceName="WSDOC_ID",allocationSize=1)  
  84.     public Long getId() {  
  85.         return id;  
  86.     }  
  87.   
  88.     public void setId(Long id) {  
  89.         this.id = id;  
  90.     }  
  91.       
  92.     @Column(name = "TRIGGERNAME",nullable = false,length=100)  
  93.     public String getTriggername() {  
  94.         return this.triggername;  
  95.     }  
  96.   
  97.     public void setTriggername(String triggername) {  
  98.         this.triggername = triggername;  
  99.     }  
  100.       
  101.     @Column(name = "CRONEXPRESSION",nullable = false,length=100)  
  102.     public String getCronexpression() {  
  103.         return this.cronexpression;  
  104.     }  
  105.   
  106.     public void setCronexpression(String cronexpression) {  
  107.         this.cronexpression = cronexpression;  
  108.     }  
  109.       
  110.     @Column(name = "JOBDETAILNAME",nullable = false,length=100)  
  111.     public String getJobdetailname() {  
  112.         return this.jobdetailname;  
  113.     }  
  114.   
  115.     public void setJobdetailname(String jobdetailname) {  
  116.         this.jobdetailname = jobdetailname;  
  117.     }  
  118.     @Column(name = "TARGETOBJECT",nullable = false,length=100)  
  119.     public String getTargetobject() {  
  120.         return this.targetobject;  
  121.     }  
  122.   
  123.     public void setTargetobject(String targetobject) {  
  124.         this.targetobject = targetobject;  
  125.     }  
  126.     @Column(name = "METHODNAME",nullable = false,length=100)  
  127.     public String getMethodname() {  
  128.         return this.methodname;  
  129.     }  
  130.   
  131.     public void setMethodname(String methodname) {  
  132.         this.methodname = methodname;  
  133.     }  
  134.     @Column(name = "CONCURRENT",nullable = false,length=100)  
  135.     public String getConcurrent() {  
  136.         return this.concurrent;  
  137.     }  
  138.   
  139.     public void setConcurrent(String concurrent) {  
  140.         this.concurrent = concurrent;  
  141.     }  
  142.     @Column(name = "STATE",nullable = false,length=100)  
  143.     public String getState() {  
  144.         return this.state;  
  145.     }  
  146.   
  147.     public void setState(String state) {  
  148.         this.state = state;  
  149.     }  
  150.     @Column(name = "README",nullable = false,length=100)  
  151.     public String getReadme() {  
  152.         return this.readme;  
  153.     }  
  154.   
  155.     public void setReadme(String readme) {  
  156.         this.readme = readme;  
  157.     }  
  158.     @Column(name = "ISSPRINGBEAN",nullable = false,length=100)  
  159.     public String getIsspringbean() {  
  160.         return isspringbean;  
  161.     }  
  162.   
  163.     public void setIsspringbean(String isspringbean) {  
  164.         this.isspringbean = isspringbean;  
  165.     }  
  166.     @Column(name = "RESERVED_1",length=100)  
  167.     public String getReserved1() {  
  168.         return reserved1;  
  169.     }  
  170.   
  171.     public void setReserved1(String reserved1) {  
  172.         this.reserved1 = reserved1;  
  173.     }  
  174.     @Column(name = "RESERVED_2",length=100)  
  175.     public String getReserved2() {  
  176.         return reserved2;  
  177.     }  
  178.   
  179.     public void setReserved2(String reserved2) {  
  180.         this.reserved2 = reserved2;  
  181.     }  
  182.     @Column(name = "RESERVED_3",length=100)  
  183.     public String getReserved3() {  
  184.         return reserved3;  
  185.     }  
  186.   
  187.     public void setReserved3(String reserved3) {  
  188.         this.reserved3 = reserved3;  
  189.     }  
  190.     @Column(name = "RESERVED_4",length=100)  
  191.     public String getReserved4() {  
  192.         return reserved4;  
  193.     }  
  194.   
  195.     public void setReserved4(String reserved4) {  
  196.         this.reserved4 = reserved4;  
  197.     }  
  198.     @Column(name = "RESERVED_5",length=100)  
  199.     public String getReserved5() {  
  200.         return reserved5;  
  201.     }  
  202.   
  203.     public void setReserved5(String reserved5) {  
  204.         this.reserved5 = reserved5;  
  205.     }  
  206.     @Column(name = "RESERVED_6",length=100)  
  207.     public String getReserved6() {  
  208.         return reserved6;  
  209.     }  
  210.   
  211.     public void setReserved6(String reserved6) {  
  212.         this.reserved6 = reserved6;  
  213.     }  
  214.     @Column(name = "RESERVED_7",length=100)  
  215.     public String getReserved7() {  
  216.         return reserved7;  
  217.     }  
  218.   
  219.     public void setReserved7(String reserved7) {  
  220.         this.reserved7 = reserved7;  
  221.     }  
  222.     @Column(name = "RESERVED_8",length=100)  
  223.     public String getReserved8() {  
  224.         return reserved8;  
  225.     }  
  226.   
  227.     public void setReserved8(String reserved8) {  
  228.         this.reserved8 = reserved8;  
  229.     }  
  230.     @Column(name = "RESERVED_9",length=100)  
  231.     public String getReserved9() {  
  232.         return reserved9;  
  233.     }  
  234.   
  235.     public void setReserved9(String reserved9) {  
  236.         this.reserved9 = reserved9;  
  237.     }  
  238.     @Column(name = "RESERVED_10",length=100)  
  239.     public String getReserved10() {  
  240.         return reserved10;  
  241.     }  
  242.   
  243.     public void setReserved10(String reserved10) {  
  244.         this.reserved10 = reserved10;  
  245.     }  
  246.   
  247.   
  248.   
  249. }  
3.核心Java代码 

[java]  view plain  copy
  1. package com.framework.timer;  
  2.   
  3. import java.text.ParseException;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6.   
  7. import org.apache.log4j.Logger;  
  8. import org.quartz.JobDetail;  
  9. import org.quartz.Scheduler;  
  10. import org.springframework.beans.BeansException;  
  11. import org.springframework.beans.factory.BeanFactory;  
  12. import org.springframework.beans.factory.BeanFactoryAware;  
  13. import org.springframework.beans.factory.annotation.Autowired;  
  14. import org.springframework.scheduling.quartz.CronTriggerBean;  
  15. import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;  
  16.   
  17. import cn.edu.svtcc.datas.model.Wsdoc;  
  18. import cn.edu.svtcc.datas.service.WsdocService;  
  19.   
  20.   
  21.   
  22. public class QuartzManager implements BeanFactoryAware {  
  23.     private Logger log = Logger.getLogger(QuartzManager.class);  
  24.     private Scheduler scheduler;  
  25.     private static BeanFactory beanFactory = null;  
  26.      
  27.     @Autowired  
  28.     private WsdocService wsdocService;  
  29.   
  30.     @SuppressWarnings("unused")  
  31.     private void reScheduleJob() throws Exception, ParseException {  
  32.         // 通过查询数据库里计划任务来配置计划任务  
  33.           
  34.         List<Wsdoc> quartzList = wsdocService.getAllTarger(); //从数据库中获取所有的配置信息,根据自己的获取方式来写,此不赘述  
[java]  view plain  copy
  1.                Wsdoc tbcq=new Wsdoc();  
  2.     tbcq.setTriggername("triggername");  
  3.     tbcq.setCronexpression("0/5 * * * * ?");  
  4.     tbcq.setJobdetailname("detailname");  
  5.     tbcq.setTargetobject("com.framework.timer.ISCSynAllData");  
  6.     tbcq.setMethodname("run");  
  7.     tbcq.setConcurrent("1");  
  8.     tbcq.setState("1");  
  9.     tbcq.setReadme("readme");  
  10.     tbcq.setIsspringbean("0");  
  11.     quartzList.add(tbcq);*/  
  12.     //this.getConfigQuartz();  
  13.     if (quartzList != null && quartzList.size() > 0) {  
  14.         for (Wsdoc tbcq1 : quartzList) {  
  15.             configQuatrz(tbcq1);  
  16.         }  
  17.     }  
  18. }  
  19.   
  20. public boolean configQuatrz(Wsdoc tbcq) {  
  21.     boolean result = false;  
  22.     try {  
  23.         // 运行时可通过动态注入的scheduler得到trigger  
  24.         CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(  
  25.                 tbcq.getTriggername(), Scheduler.DEFAULT_GROUP);  
  26.         // 如果计划任务已存在则调用修改方法  
  27.         if (trigger != null) {  
  28.             change(tbcq, trigger);  
  29.         } else {  
  30.             // 如果计划任务不存在并且数据库里的任务状态为可用时,则创建计划任务  
  31.             if (tbcq.getState().equals("1")) {  
  32.                 this.createCronTriggerBean(tbcq);  
  33.             }  
  34.         }  
  35.         result = true;  
  36.     } catch (Exception e) {  
  37.         result = false;  
  38.         e.printStackTrace();  
  39.     }  
  40.   
  41.     return result;  
  42. }  
  43.   
  44. public void change(Wsdoc tbcq, CronTriggerBean trigger)  
  45.         throws Exception {  
  46.     // 如果任务为可用  
  47.     if (tbcq.getState().equals("1")) {  
  48.         // 判断从DB中取得的任务时间和现在的quartz线程中的任务时间是否相等  
  49.         // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob  
  50.         if (!trigger.getCronExpression().equalsIgnoreCase(  
  51.                 tbcq.getCronexpression())) {  
  52.             trigger.setCronExpression(tbcq.getCronexpression());  
  53.             scheduler.rescheduleJob(tbcq.getTriggername(),  
  54.                     Scheduler.DEFAULT_GROUP, trigger);  
  55.             log.info(new Date() + ": 更新" + tbcq.getTriggername() + "计划任务");  
  56.         }  
  57.     } else {  
  58.         // 不可用  
  59.         scheduler.pauseTrigger(trigger.getName(), trigger.getGroup());// 停止触发器  
  60.         scheduler.unscheduleJob(trigger.getName(), trigger.getGroup());// 移除触发器  
  61.         scheduler.deleteJob(trigger.getJobName(), trigger.getJobGroup());// 删除任务  
  62.         log.info(new Date() + ": 删除" + tbcq.getTriggername() + "计划任务");  
  63.   
  64.     }  
  65.   
  66. }  
  67.   
  68. /** 
  69.  * 创建/添加计划任务 
  70.  *  
  71.  * @param tbcq 
  72.  *            计划任务配置对象 
  73.  * @throws Exception 
  74.  */  
  75. public void createCronTriggerBean(Wsdoc tbcq) throws Exception {  
  76.     // 新建一个基于Spring的管理Job类  
  77.     MethodInvokingJobDetailFactoryBean mjdfb = new MethodInvokingJobDetailFactoryBean();  
  78.     mjdfb.setName(tbcq.getJobdetailname());// 设置Job名称  
  79.     // 如果定义的任务类为Spring的定义的Bean则调用 getBean方法  
  80.     if (tbcq.getIsspringbean().equals("1")) {  
  81.         mjdfb.setTargetObject(beanFactory.getBean(tbcq.getTargetobject()));// 设置任务类  
  82.     } else {  
  83.         // 否则直接new对象  
  84.         mjdfb.setTargetObject(Class.forName(tbcq.getTargetobject())  
  85.                 .newInstance());// 设置任务类  
  86.     }  
  87.   
  88.     mjdfb.setTargetMethod(tbcq.getMethodname());// 设置任务方法  
  89.     mjdfb.setConcurrent(tbcq.getConcurrent().equals("0") ? false : true); // 设置是否并发启动任务  
  90.     mjdfb.afterPropertiesSet();// 将管理Job类提交到计划管理类  
  91.     // 将Spring的管理Job类转为Quartz管理Job类  
  92.     JobDetail jobDetail = new JobDetail();  
  93.     jobDetail = (JobDetail) mjdfb.getObject();  
  94.     jobDetail.setName(tbcq.getJobdetailname());  
  95.     scheduler.addJob(jobDetail, true); // 将Job添加到管理类  
  96.     // 新一个基于Spring的时间类  
  97.     CronTriggerBean c = new CronTriggerBean();  
  98.     c.setCronExpression(tbcq.getCronexpression());// 设置时间表达式  
  99.     c.setName(tbcq.getTriggername());// 设置名称  
  100.     c.setJobDetail(jobDetail);// 注入Job  
  101.     c.setJobName(tbcq.getJobdetailname());// 设置Job名称  
  102.     scheduler.scheduleJob(c);// 注入到管理类  
  103.     scheduler.rescheduleJob(tbcq.getTriggername(), Scheduler.DEFAULT_GROUP,  
  104.             c);// 刷新管理类  
  105.     log.info(new Date() + ": 新建" + tbcq.getTriggername() + "计划任务");  
  106. }  
  107.   
  108. public Scheduler getScheduler() {  
  109.     return scheduler;  
  110. }  
  111.   
  112. public void setScheduler(Scheduler scheduler) {  
  113.     this.scheduler = scheduler;  
  114. }  
  115.   
  116. public void setBeanFactory(BeanFactory factory) throws BeansException {  
  117.     this.beanFactory = factory;  
  118.   
  119. }  
  120.   
  121. public BeanFactory getBeanFactory() {  
  122.     return beanFactory;  
  123. }  
  124.     
4.测试类代码

[java]  view plain  copy
  1. package com.framework.timer;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.quartz.SchedulerException;  
  6.   
  7.   
  8.   
  9. public class ISCSynAllData{    
  10.       
  11.     public void run() throws SchedulerException{  
  12.          System.out.println("开始执行"+new Date());  
  13.     
  14.      }  
  15. }  
5.Spring.xml中的配置(标红的为核心配置)

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"   
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:context="http://www.springframework.org/schema/context"   
  5.     xmlns:task="http://www.springframework.org/schema/task"  
  6.     xsi:schemaLocation="  
  7.     http://www.springframework.org/schema/beans   
  8.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  9.     http://www.springframework.org/schema/context   
  10.     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  11.     http://www.springframework.org/schema/task     
  12.     http://www.springframework.org/schema/task/spring-task-3.0.xsd  
  13.     ">  
  14.   
  15.     <!-- 引入属性文件 -->  
  16.     <context:property-placeholder location="classpath:config.properties" />  
  17.   
  18.     <!-- 自动扫描dao和service包(自动注入) -->  
  19.     <context:component-scan base-package="com,cn" />  
  20.       
  21.     <!-- 定时任务配置 实现方式1,利用spring自带的定时器  
  22.     <task:executor id="executor" pool-size="5" />   -->  
  23.     <!-- 声明一个具有10个线程的池,每一个对象将获取同样的运行机会  
  24.     <task:scheduler id="scheduler" pool-size="10" />   -->   
  25.     <!--  定时器开关  开始  
  26.     <task:annotation-driven executor="executor" scheduler="scheduler" />-->  
  27.     <!--  定时器开关  结束-->  
  28.     <!--数据同步 -->  
  29.     <!--下面这种quartz定时器是为了实现人工对定时间的启用,停用,调用时间,和删除的操作  -->  
  30. <span style="color:#ff0000;"><!--实现方式二,利用 quartz实现定时器功能-->  
  31.   
  32. <bean id="quartzManagerBean" class="com.framework.timer.QuartzManager">  
  33.         <property name="scheduler" ref="schedulerManager" />  
  34.     </bean>  
  35.     <bean id="quartzManagerJobDetail"  
  36.         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  37.         <property name="targetObject" ref="quartzManagerBean" />  
  38.         <property name="targetMethod" value="reScheduleJob" />  
  39.         <property name="concurrent" value="false" />  
  40.     </bean>  
  41.     <!-- 主定时计划 -->  
  42.     <bean id="quartzManagerTrigger"  
  43.         class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  44.         <property name="jobDetail" ref="quartzManagerJobDetail" />  
  45.         <!-- 延时1分钟 执行任务 -->  
  46.         <property name="startDelay" value="300000" />  
  47.         <!-- 任务执行周期 5分钟 -->  
  48.         <property name="repeatInterval" value="60000" />  
  49.     </bean>  
  50.     <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  -->  
  51.     <bean id="schedulerManager" lazy-init="false" autowire="no"  
  52.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  53.         <property name="triggers">  
  54.             <list>  
  55.                 <ref bean="quartzManagerTrigger" />  
  56.             </list>  
  57.         </property>  
  58.     </bean>  
  59. </beans></span>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值