• 动态添加、修改和删除定时任务


    之前用到了定时任务,而且要求是可以动态修改定时时间,但是不要重启服务器,查了一些资料,找到了很好的一种方法,下面直接上代码。

    uartzManager.java 动态添加、修改和删除定时任务管理类

      1 package com.datcent.downloadCSV.quartzManager;
      2 
      3 import org.quartz.CronTrigger ;
      4 import org.quartz.JobDetail ;
      5 import org.quartz.Scheduler ;
      6 
      7 /**
      8  * @author 作者xujingyang. E-mail:xjy06@foxmail.com
      9  * @version 创建时间:2018年1月17日 下午3:28:14
     10  * @类说明: Quartz调度管理器
     11  */
     12 public class QuartzManager {
     13     private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
     14     private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
     15 
     16     /**
     17      * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
     18      * 
     19      * @param sched
     20      *            调度器
     21      * 
     22      * @param jobName
     23      *            任务名
     24      * @param cls
     25      *            任务
     26      * @param time
     27      *            时间设置,参考quartz说明文档
     28      * 
     29      * @Title: QuartzManager.java
     30      */
     31     public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, String time) {
     32         try {
     33             JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
     34             // 触发器
     35             CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
     36             trigger.setCronExpression(time);// 触发器时间设定
     37             sched.scheduleJob(jobDetail, trigger);
     38             // 启动
     39             if (!sched.isShutdown()) {
     40                 sched.start();
     41             }
     42         } catch (Exception e) {
     43             throw new RuntimeException(e);
     44         }
     45     }
     46 
     47     /**
     48      * @Description: 添加一个定时任务
     49      * 
     50      * @param sched
     51      *            调度器
     52      * 
     53      * @param jobName
     54      *            任务名
     55      * @param jobGroupName
     56      *            任务组名
     57      * @param triggerName
     58      *            触发器名
     59      * @param triggerGroupName
     60      *            触发器组名
     61      * @param jobClass
     62      *            任务
     63      * @param time
     64      *            时间设置,参考quartz说明文档
     65      * 
     66      * @Title: QuartzManager.java
     67      */
     68     public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,
     69             String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass, String time) {
     70         try {
     71             JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
     72             // 触发器
     73             CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
     74             trigger.setCronExpression(time);// 触发器时间设定
     75             sched.scheduleJob(jobDetail, trigger);
     76         } catch (Exception e) {
     77             throw new RuntimeException(e);
     78         }
     79     }
     80 
     81     /**
     82      * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
     83      * 
     84      * @param sched
     85      *            调度器
     86      * @param jobName
     87      * @param time
     88      * 
     89      * @Title: QuartzManager.java
     90      */
     91     @SuppressWarnings("rawtypes")
     92     public static void modifyJobTime(Scheduler sched, String jobName, String time) {
     93         try {
     94             CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME);
     95             if (trigger == null) {
     96                 return;
     97             }
     98             String oldTime = trigger.getCronExpression();
     99             if (!oldTime.equalsIgnoreCase(time)) {
    100                 JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME);
    101                 Class objJobClass = jobDetail.getJobClass();
    102                 removeJob(sched, jobName);
    103                 addJob(sched, jobName, objJobClass, time);
    104             }
    105         } catch (Exception e) {
    106             throw new RuntimeException(e);
    107         }
    108     }
    109 
    110     /**
    111      * @Description: 修改一个任务的触发时间
    112      * 
    113      * @param sched
    114      *            调度器 *
    115      * @param sched
    116      *            调度器
    117      * @param triggerName
    118      * @param triggerGroupName
    119      * @param time
    120      * 
    121      * @Title: QuartzManager.java
    122      */
    123     public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) {
    124         try {
    125             CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName, triggerGroupName);
    126             if (trigger == null) {
    127                 return;
    128             }
    129             String oldTime = trigger.getCronExpression();
    130             if (!oldTime.equalsIgnoreCase(time)) {
    131                 CronTrigger ct = (CronTrigger) trigger;
    132                 // 修改时间
    133                 ct.setCronExpression(time);
    134                 // 重启触发器
    135                 sched.resumeTrigger(triggerName, triggerGroupName);
    136             }
    137         } catch (Exception e) {
    138             throw new RuntimeException(e);
    139         }
    140     }
    141 
    142     /**
    143      * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
    144      * 
    145      * @param sched
    146      *            调度器
    147      * @param jobName
    148      * 
    149      * @Title: QuartzManager.java
    150      */
    151     public static void removeJob(Scheduler sched, String jobName) {
    152         try {
    153             sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
    154             sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
    155             sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
    156         } catch (Exception e) {
    157             throw new RuntimeException(e);
    158         }
    159     }
    160 
    161     /**
    162      * @Description: 移除一个任务
    163      * 
    164      * @param sched
    165      *            调度器
    166      * @param jobName
    167      * @param jobGroupName
    168      * @param triggerName
    169      * @param triggerGroupName
    170      * 
    171      * @Title: QuartzManager.java
    172      */
    173     public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,
    174             String triggerGroupName) {
    175         try {
    176             sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
    177             sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
    178             sched.deleteJob(jobName, jobGroupName);// 删除任务
    179         } catch (Exception e) {
    180             throw new RuntimeException(e);
    181         }
    182     }
    183 
    184     /**
    185      * @Description:启动所有定时任务
    186      * 
    187      * @param sched
    188      *            调度器
    189      * 
    190      * @Title: QuartzManager.java
    191      */
    192     public static void startJobs(Scheduler sched) {
    193         try {
    194             sched.start();
    195         } catch (Exception e) {
    196             throw new RuntimeException(e);
    197         }
    198     }
    199 
    200     /**
    201      * @Description:关闭所有定时任务
    202      * 
    203      * 
    204      * @param sched
    205      *            调度器
    206      * 
    207      * 
    208      * @Title: QuartzManager.java
    209      */
    210     public static void shutdownJobs(Scheduler sched) {
    211         try {
    212             if (!sched.isShutdown()) {
    213                 sched.shutdown();
    214             }
    215         } catch (Exception e) {
    216             throw new RuntimeException(e);
    217         }
    218     }
    219 }
    View Code

    Job任务类:

     

     1 package com.datcent.downloadCSV.quartzJob;
     2 
     3 import java.text.SimpleDateFormat ;
     4 import java.util.Date ;
     5 import org.apache.log4j.Logger ;
     6 import org.quartz.Job ;
     7 import org.quartz.JobExecutionContext ;
     8 import org.quartz.JobExecutionException ;
     9 import com.datcent.downloadCSV.download.CSVDownload ;
    10 
    11 /**
    12  * @author 作者xujingyang. E-mail:xjy06@foxmail.com
    13  * @version 创建时间:2018年1月17日 下午3:25:59
    14  * @类说明:
    15  */
    16 public class QuartzJob implements Job {
    17     /* 日志记录对象 */
    18     private static  Logger logger = Logger.getLogger(QuartzJob.class);
    19     
    20     @Override
    21     public void execute(JobExecutionContext arg0) throws JobExecutionException {
    22          System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "★★★★★★★★★★★开始下载");
    23          try {
    24             CSVDownload.csvDownloadByUrl();
    25         } catch (Exception e) {
    26             e.printStackTrace();
    27         }
    28     }
    29 }

    同时用到了,系统启动监听类:

    1.首先定义接口继承EventListener 

     1 package com.datcent.systemStartup.startupListener;
     2 
     3 import java.util.EventListener ;
     4 import org.springframework.context.ApplicationEvent ;
     5 
     6 /**
     7  * @author 作者xujingyang. E-mail:xjy06@foxmail.com
     8  * @version 创建时间:2018年1月17日 下午4:15:59
     9  * @类说明: ApplicationListener<ApplicationEvent> 接口
    10  */
    11 public interface StartupListener<E extends ApplicationEvent> extends EventListener {
    12     void onApplicationEvent(E var1);
    13 }

     2.实现接口,接口中实现的放对任务调度进行管理

     1 package com.datcent.systemStartup.startupListenerImpl;
     2 
     3 import com.datcent.core.comm.GLOBAL_CONSTANT;
     4 import com.datcent.core.util.PropertiesLoader;
     5 import com.datcent.downloadCSV.quartzJob.QuartzJob;
     6 import com.datcent.downloadCSV.quartzManager.QuartzManager;
     7 import com.datcent.systemStartup.startupListener.StartupListener;
     8 import org.quartz.Scheduler;
     9 import org.quartz.SchedulerFactory;
    10 import org.quartz.impl.StdSchedulerFactory;
    11 import org.springframework.beans.BeansException;
    12 import org.springframework.beans.factory.InitializingBean;
    13 import org.springframework.context.ApplicationContext;
    14 import org.springframework.context.ApplicationContextAware;
    15 import org.springframework.context.event.ContextRefreshedEvent;
    16 import org.springframework.stereotype.Component;
    17 import org.springframework.web.context.ServletContextAware;
    18 
    19 import javax.servlet.ServletContext;
    20 
    21 /**
    22  * @author 作者xujingyang. E-mail:xjy06@foxmail.com
    23  * @version 创建时间:2018年1月17日 下午4:17:16
    24  * @类说明: 程序启动执行,方法从上到下执行顺序:1->2->3->4 其中4会执行多次
    25  */
    26 @Component
    27 public class StartupListenerImpl implements StartupListener<ContextRefreshedEvent>, ApplicationContextAware,
    28         ServletContextAware, InitializingBean {
    29 
    30     /*
    31      * 1
    32      */
    33     @Override
    34     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    35         try {
    36             // 获取配置文件时间
    37             PropertiesLoader loader = new PropertiesLoader(GLOBAL_CONSTANT.CSV_DOWLOAD_TIME_FILEPATH);
    38             String csvDownloadTime = loader.getProperty(GLOBAL_CONSTANT.CSV_DOWLOAD_TIME_KEY);
    39             String cronTime = "0 0/"+csvDownloadTime+" * * * ? ";
    40 
    41             System.out.println(cronTime);
    42 
    43             // 启动定时任务
    44             SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
    45             Scheduler sche = gSchedulerFactory.getScheduler();
    46             System.out.println("【系统启动】开始...");
    47             QuartzManager.addJob(sche, GLOBAL_CONSTANT.JOB_NAME, QuartzJob.class, cronTime);
    48         } catch (Exception e) {
    49             e.printStackTrace();
    50         }
    51     }
    52 
    53     /*
    54      * 2
    55      */
    56     @Override
    57     public void setServletContext(ServletContext arg0) {
    58     }
    59 
    60     /*
    61      * 3:初始化bean之前
    62      */
    63     @Override
    64     public void afterPropertiesSet() throws Exception {
    65 
    66     }
    67 
    68     /*
    69      * 4,bean被注入时执行
    70      */
    71     @Override
    72     public void onApplicationEvent(ContextRefreshedEvent evt) {
    73     }
    74 
    75 }

    任务调度动态管理,大致就是这么简单。

  • 相关阅读:
    python3-返回函数
    python3-sorted
    python3-filter
    学习笔记134—word里如何在□里打√!框框里打勾!!!!!
    学习笔记133—型号最全的海信电视root教程及root工具下载
    学习笔记132—英文写作n个细节注意事项
    学习笔记131— Manuals for Tencent meeting (english)
    学习笔记130— 解决No module named 'sklearn.cross_validation'
    学习笔记129—电脑其他声音都正常,只有网易云音乐突然没声音了 急死人
    学习笔记128—PS 不改变像素的情况下,变换照片内存大小
  • 原文地址:https://www.cnblogs.com/xujingyang/p/8580271.html
Copyright © 2020-2023  润新知