Spring4整合quartz2.2.3,quartz动态任务

Spring4整合quartz2.2.3,quartz动态任务

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年9月6日

http://www.cnblogs.com/fanshuyao/

可以直接看总结篇: http://www.cnblogs.com/fanshuyao/p/7484843.html

 quartz下载

http://www.quartz-scheduler.org/downloads/

一、quartz动态任务管理类:

Java代码  收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import java.util.Set;  
  4.   
  5. import org.quartz.CronScheduleBuilder;  
  6. import org.quartz.CronTrigger;  
  7. import org.quartz.Job;  
  8. import org.quartz.JobBuilder;  
  9. import org.quartz.JobDetail;  
  10. import org.quartz.JobExecutionContext;  
  11. import org.quartz.JobKey;  
  12. import org.quartz.Scheduler;  
  13. import org.quartz.SchedulerException;  
  14. import org.quartz.Trigger;  
  15. import org.quartz.TriggerBuilder;  
  16. import org.quartz.TriggerKey;  
  17. import org.quartz.impl.matchers.GroupMatcher;  
  18. import org.slf4j.Logger;  
  19. import org.slf4j.LoggerFactory;  
  20. import org.springframework.beans.factory.annotation.Autowired;  
  21.   
  22. import cn.imovie.common.utils.CC;  
  23. import cn.imovie.common.utils.JasonUtils;  
  24. import cn.imovie.common.utils.SpringUtils;  
  25. import cn.imovie.entity.task.ScheduleJob;  
  26. import cn.imovie.service.ScheduleJobService;  
  27.   
  28. public class SchedulerManage {  
  29.   
  30.     private Logger log = LoggerFactory.getLogger(SchedulerManage.class);  
  31.       
  32.     private Scheduler scheduler = (Scheduler) SpringUtils.getBeanById("scheduler");  
  33.       
  34.     @Autowired  
  35.     private ScheduleJobService scheduleJobService;  
  36.       
  37.     /** 
  38.      * 新增任务 
  39.      * @param scheduleJob 
  40.      */  
  41.     @SuppressWarnings("unchecked")  
  42.     public void addJob(ScheduleJob scheduleJob){  
  43.         TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  44.         try {  
  45.             //任务触发  
  46.             CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);  
  47.             if (null == trigger) {  
  48.                 JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(scheduleJob.getClazz()))  
  49.                   .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build();  
  50.                 jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);  
  51.                   
  52.                 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());  
  53.                 /*withMisfireHandlingInstructionDoNothing 
  54.                 ——不触发立即执行 
  55.                 ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行 
  56.  
  57.                 withMisfireHandlingInstructionIgnoreMisfires 
  58.                 ——以错过的第一个频率时间立刻开始执行 
  59.                 ——重做错过的所有频率周期后 
  60.                 ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行 
  61.  
  62.                 withMisfireHandlingInstructionFireAndProceed 
  63.                 ——以当前时间为触发频率立刻触发一次执行 
  64.                 ——然后按照Cron频率依次执行*/  
  65.                 trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).withSchedule(cronScheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();  
  66.                 scheduler.scheduleJob(jobDetail, trigger);  
  67.                 log.info(CC.LOG_PREFIX + "新增任务:"+JasonUtils.Object2String(scheduleJob));  
  68.             }else {  
  69.                 // Trigger已存在,那么更新相应的定时设置  
  70.                 //表达式调度构建器  
  71.                 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());  
  72.                 //按新的cronExpression表达式重新构建trigger  
  73.                 trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();  
  74.                 //按新的trigger重新设置job执行  
  75.                 scheduler.rescheduleJob(triggerKey, trigger);  
  76.                 log.info(CC.LOG_PREFIX + "任务"+JasonUtils.Object2String(scheduleJob)+"已经存在,更新trigger");  
  77.             }  
  78.             //scheduleJobService.save(req, sysUserInSession, scheduleJob);  
  79.         } catch (Exception e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.     }  
  83.       
  84.     /** 
  85.      * 暂停任务 
  86.      * @param scheduleJob 
  87.      */  
  88.     public void pauseJob(ScheduleJob scheduleJob){  
  89.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  90.         try {  
  91.             scheduler.pauseJob(jobKey);  
  92.             log.info(CC.LOG_PREFIX + "暂停任务:"+JasonUtils.Object2String(scheduleJob));  
  93.         } catch (SchedulerException e) {  
  94.             e.printStackTrace();  
  95.         }  
  96.     }  
  97.       
  98.     /** 
  99.      * 暂停全部任务 
  100.      */  
  101.     public void pauseAll(){  
  102.         try {  
  103.             scheduler.pauseAll();  
  104.             log.info(CC.LOG_PREFIX + "暂停所有任务");  
  105.         } catch (SchedulerException e) {  
  106.             e.printStackTrace();  
  107.         }  
  108.     }  
  109.       
  110.     /** 
  111.      * 恢复任务 
  112.      * @param scheduleJob 
  113.      */  
  114.     public void resumeJob(ScheduleJob scheduleJob){  
  115.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  116.         try {  
  117.             scheduler.resumeJob(jobKey);  
  118.             log.info(CC.LOG_PREFIX + "恢复任务:"+JasonUtils.Object2String(scheduleJob));  
  119.         } catch (SchedulerException e) {  
  120.             e.printStackTrace();  
  121.         }  
  122.     }  
  123.       
  124.       
  125.     /** 
  126.      * 恢复所有任务 
  127.      */  
  128.     public void resumeAll(){  
  129.         try {  
  130.             scheduler.resumeAll();  
  131.             log.info(CC.LOG_PREFIX + "恢复所有任务");  
  132.         } catch (SchedulerException e) {  
  133.             e.printStackTrace();  
  134.         }  
  135.     }  
  136.       
  137.     /** 
  138.      * 删除任务后,所对应的trigger也将被删除 
  139.      * @param scheduleJob 
  140.      */  
  141.     public void deleteJob(ScheduleJob scheduleJob){  
  142.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  143.         try {  
  144.             scheduler.pauseJob(jobKey);//先暂停任务  
  145.             scheduler.deleteJob(jobKey);//再删除任务  
  146.             log.info(CC.LOG_PREFIX + "删除任务:"+JasonUtils.Object2String(scheduleJob));  
  147.         } catch (SchedulerException e) {  
  148.             e.printStackTrace();  
  149.         }  
  150.     }  
  151.       
  152.     /** 
  153.      * 立即运行任务 
  154.      * @param scheduleJob 
  155.      */  
  156.     public void triggerJob(ScheduleJob scheduleJob){  
  157.         JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  158.         try {  
  159.             scheduler.triggerJob(jobKey);  
  160.             log.info(CC.LOG_PREFIX + "运行任务:"+JasonUtils.Object2String(scheduleJob));  
  161.         } catch (SchedulerException e) {  
  162.             e.printStackTrace();  
  163.         }  
  164.     }  
  165.       
  166.     /** 
  167.      * 更新任务的时间表达式 
  168.      * @param scheduleJob 
  169.      */  
  170.     public void updateJob(ScheduleJob scheduleJob){  
  171.         try {  
  172.             TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());  
  173.   
  174.             //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"  
  175.             CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);  
  176.   
  177.             //表达式调度构建器  
  178.             CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());  
  179.   
  180.             //按新的cronExpression表达式重新构建trigger  
  181.             trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();  
  182.             //按新的trigger重新设置job执行  
  183.             scheduler.rescheduleJob(triggerKey, trigger);  
  184.             log.info(CC.LOG_PREFIX + "更新任务:"+JasonUtils.Object2String(scheduleJob));  
  185.         } catch (SchedulerException e) {  
  186.             e.printStackTrace();  
  187.         }  
  188.     }  
  189.       
  190.       
  191.     /** 
  192.      * 获取quartz调度器的计划任务 
  193.      * @return 
  194.      */  
  195.     public List<ScheduleJob> getScheduleJobList(){  
  196.         List<ScheduleJob> jobList = null;  
  197.         try {  
  198.             GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();  
  199.             Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);  
  200.             jobList = new ArrayList<ScheduleJob>();  
  201.             for (JobKey jobKey : jobKeys) {  
  202.                 List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);  
  203.                 for (Trigger trigger : triggers) {  
  204.                     ScheduleJob job = new ScheduleJob();  
  205.                     job.setJobName(jobKey.getName());  
  206.                     job.setJobGroup(jobKey.getGroup());  
  207.                     job.setClazz(jobKey.getClass().toString());  
  208.                     job.setJobDesc("触发器:" + trigger.getKey());  
  209.                     Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());  
  210.                     job.setJobStatus(triggerState.name());  
  211.                     if (trigger instanceof CronTrigger) {  
  212.                         CronTrigger cronTrigger = (CronTrigger) trigger;  
  213.                         String cronExpression = cronTrigger.getCronExpression();  
  214.                         job.setCronExpression(cronExpression);  
  215.                     }  
  216.                     jobList.add(job);  
  217.                 }  
  218.             }  
  219.         } catch (Exception e) {  
  220.             e.printStackTrace();  
  221.         }  
  222.         return jobList;  
  223.     }  
  224.       
  225.     /** 
  226.      * 获取quartz调度器的运行任务 
  227.      * @return 
  228.      */  
  229.     public List<ScheduleJob> getScheduleJobRunningList(){  
  230.         List<ScheduleJob> jobList = null;  
  231.         try {  
  232.             List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();  
  233.             jobList = new ArrayList<ScheduleJob>(executingJobs.size());  
  234.             for (JobExecutionContext executingJob : executingJobs) {  
  235.               ScheduleJob job = new ScheduleJob();  
  236.               JobDetail jobDetail = executingJob.getJobDetail();  
  237.               JobKey jobKey = jobDetail.getKey();  
  238.               Trigger trigger = executingJob.getTrigger();  
  239.               job.setJobName(jobKey.getName());  
  240.               job.setJobGroup(jobKey.getGroup());  
  241.               job.setClazz(jobKey.getClass().toString());  
  242.               job.setJobDesc("触发器:" + trigger.getKey());  
  243.               Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());  
  244.               job.setJobStatus(triggerState.name());  
  245.               if (trigger instanceof CronTrigger) {  
  246.                 CronTrigger cronTrigger = (CronTrigger) trigger;  
  247.                 String cronExpression = cronTrigger.getCronExpression();  
  248.                 job.setCronExpression(cronExpression);  
  249.               }  
  250.               jobList.add(job);  
  251.             }  
  252.         } catch (Exception e) {  
  253.             e.printStackTrace();  
  254.         }  
  255.         return jobList;  
  256.     }  
  257.   
  258.     public Scheduler getScheduler() {  
  259.         return scheduler;  
  260.     }  
  261.   
  262.     public void setScheduler(Scheduler scheduler) {  
  263.         this.scheduler = scheduler;  
  264.     }  
  265.   
  266.       
  267.       
  268. }  

 注意事项:

1、SchedulerFactoryBean 在spring.xml配置了,但不能直接注入,就算加上@Component注解也不行,所以使用SpringUtils 工具类获取。

Xml代码  收藏代码
  1. <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    

2、获取到的SchedulerFactoryBean 并不是SchedulerFactoryBean,而是scheduler

Java代码  收藏代码
  1. private Scheduler scheduler = (Scheduler) SpringUtils.getBeanById("scheduler");  

二、ScheduleJob 类:可以保存计划任务的信息,也可以做为实体参数

Java代码  收藏代码
  1. public class ScheduleJob implements Serializable{  
  2.       
  3.     private Long scheduleJobId;  
  4.       
  5.     /** 任务名称 */  
  6.     private String jobName;  
  7.       
  8.     /** 任务分组 */  
  9.     private String jobGroup;  
  10.       
  11.     /** 定时任务对应的类(包括包路径),如:cn.imovie.manage.task.job.TicketMoneyLessThanNormalWarn */  
  12.     private String clazz;  
  13.       
  14.     /** 任务状态:1禁用 2启用 3删除*/  
  15.     private String jobStatus;  
  16.       
  17.     /** 任务运行时间表达式 */  
  18.     private String cronExpression;  
  19.       
  20.     /** 任务描述 */  
  21.     private String jobDesc;  
  22.       
  23.     private Long createMan;  
  24.     private Date createTime;  
  25.     private Long updateMan;  
  26.     private Date updateTime;  
  27.       
  28.     // 非持久化属性  
  29.     private String createManText;  
  30.     private String updateManText;  
  31.   
  32.       
  33.     public Long getScheduleJobId() {  
  34.         return scheduleJobId;  
  35.     }  
  36.   
  37.     public void setScheduleJobId(Long scheduleJobId) {  
  38.         this.scheduleJobId = scheduleJobId;  
  39.     }  
  40.   
  41.     public String getJobName() {  
  42.         return jobName;  
  43.     }  
  44.   
  45.     public void setJobName(String jobName) {  
  46.         this.jobName = jobName;  
  47.     }  
  48.   
  49.     public String getJobGroup() {  
  50.         return jobGroup;  
  51.     }  
  52.   
  53.     public void setJobGroup(String jobGroup) {  
  54.         this.jobGroup = jobGroup;  
  55.     }  
  56.   
  57.     public String getClazz() {  
  58.         return clazz;  
  59.     }  
  60.   
  61.     public void setClazz(String clazz) {  
  62.         this.clazz = clazz;  
  63.     }  
  64.   
  65.     public String getJobStatus() {  
  66.         return jobStatus;  
  67.     }  
  68.   
  69.     public void setJobStatus(String jobStatus) {  
  70.         this.jobStatus = jobStatus;  
  71.     }  
  72.   
  73.     public String getCronExpression() {  
  74.         return cronExpression;  
  75.     }  
  76.   
  77.     public void setCronExpression(String cronExpression) {  
  78.         this.cronExpression = cronExpression;  
  79.     }  
  80.   
  81.     public String getJobDesc() {  
  82.         return jobDesc;  
  83.     }  
  84.   
  85.     public void setJobDesc(String jobDesc) {  
  86.         this.jobDesc = jobDesc;  
  87.     }  
  88.   
  89.     public Long getCreateMan() {  
  90.         return createMan;  
  91.     }  
  92.   
  93.     public void setCreateMan(Long createMan) {  
  94.         this.createMan = createMan;  
  95.     }  
  96.   
  97.     public Date getCreateTime() {  
  98.         return createTime;  
  99.     }  
  100.   
  101.     public void setCreateTime(Date createTime) {  
  102.         this.createTime = createTime;  
  103.     }  
  104.   
  105.     public Long getUpdateMan() {  
  106.         return updateMan;  
  107.     }  
  108.   
  109.     public void setUpdateMan(Long updateMan) {  
  110.         this.updateMan = updateMan;  
  111.     }  
  112.   
  113.     public Date getUpdateTime() {  
  114.         return updateTime;  
  115.     }  
  116.   
  117.     public void setUpdateTime(Date updateTime) {  
  118.         this.updateTime = updateTime;  
  119.     }  
  120.   
  121.     @Transient  
  122.     public String getCreateManText() {  
  123.         return createManText;  
  124.     }  
  125.   
  126.     public void setCreateManText(String createManText) {  
  127.         this.createManText = createManText;  
  128.     }  
  129.   
  130.     @Transient  
  131.     public String getUpdateManText() {  
  132.         return updateManText;  
  133.     }  
  134.   
  135.     public void setUpdateManText(String updateManText) {  
  136.         this.updateManText = updateManText;  
  137.     }  
  138.   
  139.       
  140.       
  141. }  

三、Spring.xml 文件配置

Xml代码  收藏代码
  1. <!-- 定时任务配置 start -->  
  2.     <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
  3.         <property name="dataSource" ref="dataSource"></property>      
  4.         <!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->        
  5.         <property name="overwriteExistingJobs" value="true" />        
  6.          <!--必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动 -->      
  7.         <property name="startupDelay" value="10" />      
  8.         <!-- 设置自动启动 -->      
  9.         <property name="autoStartup" value="true" />    
  10.         <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />  
  11.         <property name="configLocation" value="classpath:spring-quartz.properties" />        
  12.     </bean>  
  13.       
  14.     <bean id="schedulerManage" class="cn.imovie.manage.task.SchedulerManage"></bean>  
  15.     <!-- 定时任务配置 end -->  

四、spring-quartz.properties 文件配置:

Java代码  收藏代码
  1. #配置见:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering.html  
  2. #============================================================================  
  3. # Configure Main Scheduler Properties    
  4. #============================================================================  
  5.   
  6. org.quartz.scheduler.instanceName = MyClusteredScheduler  
  7. org.quartz.scheduler.instanceId = AUTO  
  8.   
  9. #============================================================================  
  10. # Configure ThreadPool    
  11. #============================================================================  
  12.   
  13. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  14. org.quartz.threadPool.threadCount = 25  
  15. org.quartz.threadPool.threadPriority = 5  
  16.   
  17. #============================================================================  
  18. # Configure JobStore    
  19. #============================================================================  
  20.   
  21. org.quartz.jobStore.misfireThreshold = 60000  
  22.   
  23. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
  24. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
  25. org.quartz.jobStore.useProperties = false  
  26. org.quartz.jobStore.dataSource = myDS  
  27. org.quartz.jobStore.tablePrefix = QRTZ_  
  28.   
  29. org.quartz.jobStore.isClustered = true  
  30. org.quartz.jobStore.clusterCheckinInterval = 20000  

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年9月6日

http://www.cnblogs.com/fanshuyao/

原文地址:https://www.cnblogs.com/fanshuyao/p/7484784.html