zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
    cf1114D 区间dp基础
    poj2411 状态压缩-铺地板题型-轮廓线解法(最优)
    poj3254 炮兵阵地弱化版,记数类dp
    poj2441状态压缩dp基础
    zoj3471 状态压缩dp基础
    北极通讯网络(最小生成树)
    黑暗城堡(生成树)
    关押罪犯(并查集)
    搭配购买(并查集+0/1背包)
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/7484784.html
Copyright © 2011-2022 走看看