zoukankan      html  css  js  c++  java
  • 动态quartz新增、修改、删除

    1.定义job导出类

     1 public class MyQuartzJob implements Job {
     2         private static Logger logger = LoggerFactory.getLogger(MyQuartzJob.class);
     3 
     4         @Override
     5         public void execute(JobExecutionContext context) throws JobExecutionException {
     6             // TODO Auto-generated method stub
     7             System.out.println("任务成功运行,时间为:===" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
     8             // JobDataMap jdm = context.getMergedJobDataMap();
     9 
    10             JobDetailImpl jdi = (JobDetailImpl) context.getJobDetail();
    11 
    12             JobKey jk = jdi.getKey();
    13 
    14             String jobName = jk.getName();
    15             String jobGroup = jk.getGroup();
    16 
    17             Trigger trigger = context.getTrigger();
    18             TriggerKey triggerKey = trigger.getKey();
    19 
    20             String triggerName = triggerKey.getName();
    21             String triggerGroup = triggerKey.getGroup();
    22 
    23             if (jobName.equals("我的cron任务1")) {
    24                 try {
    25                     QuartzManager.modifyJobTime(triggerKey, "0 0/3 * * * ?");
    26                 } catch (SchedulerException e) {
    27                     // TODO Auto-generated catch block
    28                     e.printStackTrace();
    29                 }
    30             }
    31             System.out.println("当前执行的job是:" + jobName + ";job的组名是:" + jobGroup + ";trigger名称是:" + triggerName
    32                     + ";trigger的组名是:" + triggerGroup + ";下次执行时间为:"
    33                     + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(context.getNextFireTime()));
    34             System.out.println();
    35             // JobDetailImpl scheduleJob = (JobDetailImpl)
    36             // context.getMergedJobDataMap().get("scheduleJob");
    37             // System.out.println("任务名称 = [" + scheduleJob.getName() + "]");
    38 
    39             /*
    40              *从jobDataMap中取得推送相关的额外信息; 
    41              * */
    42             JobDataMap dataMap = context.getMergedJobDataMap();
    43             // userId
    44             String userId = (String) dataMap.get("userId");
    45             //
    46             String messageTypes = (String) dataMap.get("messageTypes");
    47 
    48             //下边的这里是项目的业务   就不贴出来了
    49             // 根据用户id查询该用户定义的
    50             // PushAlarmService alarmService = SpringUtils.getBean(PushAlarmService.class);
    51             // alarmService.selByUserId(Integer.valueOf(userId));
    52 
    53         }
    54     }

    2.定义一个定时器的管理类:专门负责定时器的新增、修改、删除、启动、结束等。

      1   import org.quartz.CronScheduleBuilder;
      2     import org.quartz.CronTrigger;
      3     import org.quartz.JobBuilder;
      4     import org.quartz.JobDataMap;
      5     import org.quartz.JobDetail;
      6     import org.quartz.JobKey;
      7     import org.quartz.Scheduler;
      8     import org.quartz.SchedulerException;
      9     import org.quartz.SimpleScheduleBuilder;
     10     import org.quartz.SimpleTrigger;
     11     import org.quartz.Trigger;
     12     import org.quartz.TriggerBuilder;
     13     import org.quartz.TriggerKey;
     14     import org.quartz.impl.StdSchedulerFactory;
     15 
     16     public class QuartzManager {
     17         // private static final String JOB_GROUP_NAME = "SDJK_APP_JOBGROUP_NAME";
     18         /// private static String TRIGGER_GROUP_NAME = "SDJK_APP_TRIGGERGROUP_NAME";
     19         public static StdSchedulerFactory sf = new StdSchedulerFactory();
     20         // public static StdScheduler ss = (StdScheduler) SpringUtils.getBean("schedulerFactoryBean");
     21 
     22         /**
     23          * 
     24          * @Title:
     25          * @Description: 创建SimpleTrigger定时器,startnow,run forever
     26          *
     27          * @param jobKey
     28          * @param triggerKey
     29          * @param cls
     30          * @param repeatIntevalTime
     31          * @throws SchedulerException
     32          */
     33         public static void addJob(JobKey jobKey, TriggerKey triggerKey, Class<? extends Job> cls, int repeatIntevalTime,
     34                 JobDataMap jobDataMap) throws SchedulerException {
     35 
     36             Scheduler sched = sf.getScheduler();
     37 
     38             JobDetail jd = JobBuilder.newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();// jobDetail
     39 
     40             SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
     41                     .withSchedule(
     42                             SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(repeatIntevalTime).repeatForever())
     43                     .startNow().build();// triggerkey用来标识trigger身份
     44 
     45             sched.scheduleJob(jd, trigger);// 设置调度器
     46 
     47             try {
     48 
     49                 if (!sched.isShutdown()) {
     50                     sched.start();
     51                 }
     52 
     53             } catch (SchedulerException e) {
     54                 // TODO Auto-generated catch block
     55                 e.printStackTrace();
     56             }
     57         }
     58 
     59         /**
     60          * 
     61          * @Title:
     62          * @Description: 添加cronTrigger的定时器
     63          *
     64          * @param jobKey
     65          * @param triggerKey
     66          * @param jobClass
     67          * @param cron
     68          * @param JobDataMap
     69          *            jobDataMap
     70          */
     71         @SuppressWarnings({ "unchecked", "rawtypes" })
     72         public static void addJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron,
     73                 JobDataMap jobDataMap) {
     74             try {
     75                 // 任务名,任务组,任务执行类;可以将自己需要的额外信息添加到jobdatamap中。
     76                 JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build();
     77 
     78                 TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器
     79 
     80                 triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组
     81 
     82                 triggerBuilder.startNow();// 现在执行
     83 
     84                 triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 触发器执行规则
     85 
     86                 CronTrigger trigger = (CronTrigger) triggerBuilder.build();// 创建CronTrigger对象
     87 
     88                 Scheduler sched = sf.getScheduler();// 创建调度器
     89 
     90                 sched.scheduleJob(jobDetail, trigger);// 调度容器设置JobDetail和Trigger
     91 
     92                 if (!sched.isShutdown()) {// 启动
     93                     sched.start();
     94                 }
     95             } catch (Exception e) {
     96                 throw new RuntimeException(e);
     97             }
     98         }
     99 
    100         /**
    101          * 
    102          * @Title:
    103          * @Description: 修改cronTrigger定时器
    104          *
    105          * @param triggerKey
    106          *            trigger标识
    107          * @param cron
    108          * @throws SchedulerException
    109          */
    110         public static void modifyJobTime(TriggerKey triggerKey, String cron) throws SchedulerException {
    111 
    112             Scheduler sched = sf.getScheduler();
    113 
    114             try {
    115                 // TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
    116 
    117                 CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
    118 
    119                 if (trigger == null) {
    120                     return;
    121                 }
    122 
    123                 String oldTime = trigger.getCronExpression();
    124 
    125                 if (!oldTime.equalsIgnoreCase(cron)) {
    126 
    127                     /** 方式一 :调用 rescheduleJob 开始 */
    128                     TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器
    129 
    130                     triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组
    131 
    132                     triggerBuilder.startNow();// 立即执行
    133 
    134                     triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 触发器时间设定
    135 
    136                     trigger = (CronTrigger) triggerBuilder.build();// 创建Trigger对象
    137 
    138                     sched.rescheduleJob(triggerKey, trigger);// 修改一个任务的触发时间
    139 
    140                     /** 方式一 :调用 rescheduleJob 结束 */
    141 
    142                     /** 方式二:先删除,然后在创建一个新的Job */
    143                     // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
    144                     // Class<? extends Job> jobClass = jobDetail.getJobClass();
    145                     // removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
    146                     // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
    147                     /** 方式二 :先删除,然后在创建一个新的Job */
    148                 }
    149             } catch (Exception e) {
    150                 throw new RuntimeException(e);
    151             }
    152         }
    153 
    154         /**
    155          * 
    156          * @Title:
    157          * @Description: 只修改simpleTrigger触发器的触发时间,不更改trigger的triggerKey
    158          *
    159          * @param triggerKey
    160          *            trigger标识
    161          * @param repeatIntervalTime
    162          *            重复间隔时长
    163          * @throws SchedulerException
    164          */
    165         public static void modifyJobTime(TriggerKey triggerKey, int repeatIntervalTime) throws SchedulerException {
    166 
    167             Scheduler sched = sf.getScheduler();
    168 
    169             try {
    170 
    171                 SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(triggerKey);
    172 
    173                 if (trigger == null) {
    174                     return;
    175                 }
    176 
    177                 long oldTime = trigger.getRepeatInterval();
    178 
    179                 if (oldTime != repeatIntervalTime) {
    180 
    181                     /** 方式一 :调用 rescheduleJob 开始 */
    182                     TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器builder
    183 
    184                     triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组
    185 
    186                     triggerBuilder.withSchedule(SimpleScheduleBuilder.repeatHourlyForever(repeatIntervalTime));// 更新触发器的重复间隔时间
    187 
    188                     triggerBuilder.startNow();// 立即执行
    189 
    190                     trigger = (SimpleTrigger) triggerBuilder.build();// 创建Trigger对象
    191 
    192                     sched.rescheduleJob(triggerKey, trigger);// 修改一个任务的触发时间
    193 
    194                     /** 方式一 :调用 rescheduleJob 结束 */
    195 
    196                     /** 方式二:先删除,然后在创建一个新的Job */
    197                     // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
    198                     // Class<? extends Job> jobClass = jobDetail.getJobClass();
    199                     // removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
    200                     // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
    201                     /** 方式二 :先删除,然后在创建一个新的Job */
    202                 }
    203 
    204             } catch (Exception e) {
    205                 throw new RuntimeException(e);
    206             }
    207         }
    208 
    209         /**
    210          * 
    211          * @Title:
    212          * @Description: 根据job和trigger删除任务
    213          *
    214          * @param jobKey
    215          * @param triggerKey
    216          */
    217         public static void removeJob(JobKey jobKey, TriggerKey triggerKey) {
    218 
    219             try {
    220 
    221                 Scheduler sched = sf.getScheduler();
    222 
    223                 sched.pauseTrigger(triggerKey);// 停止触发器
    224 
    225                 sched.unscheduleJob(triggerKey);// 移除触发器
    226 
    227                 sched.deleteJob(jobKey);// 删除任务
    228 
    229             } catch (Exception e) {
    230 
    231                 throw new RuntimeException(e);
    232 
    233             }
    234         }
    235 
    236         /**
    237          * @Description:启动所有定时任务
    238          */
    239         public static void startJobs(Scheduler sched) {
    240             try {
    241                 sched.start();
    242             } catch (Exception e) {
    243                 throw new RuntimeException(e);
    244             }
    245         }
    246 
    247         /**
    248          * @Description:关闭所有定时任务
    249          */
    250         public static void shutdownJobs(Scheduler sched) {
    251             try {
    252                 if (!sched.isShutdown()) {
    253                     sched.shutdown();
    254                 }
    255             } catch (Exception e) {
    256                 throw new RuntimeException(e);
    257             }
    258         }
    259 
    260         /**
    261          * 
    262          * @Title:
    263          * @Description: 新增或者修改
    264          *
    265          * @param jobKey
    266          * @param triggerKey
    267          * @param clz
    268          * @param intervalTime
    269          * @param jobDataMap
    270          * @throws SchedulerException
    271          */
    272         public static void addOrModify(JobKey jobKey, TriggerKey triggerKey, @SuppressWarnings("rawtypes") Class clz,
    273                 int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
    274 
    275             Scheduler sched = sf.getScheduler();
    276 
    277             if (sched.checkExists(jobKey)) {// 如果存在,则modify一下job和trigger
    278 
    279             }
    280 
    281             if (sched.checkExists(triggerKey)) {// modify修改trigger
    282 
    283                 modifyJobTime(triggerKey, intervalTime);
    284 
    285             } else {// add新增
    286 
    287                 addJob(jobKey, triggerKey, clz, intervalTime, jobDataMap);
    288 
    289             }
    290 
    291         }
    292     }

    可以看到,每次创建job是都要使用一个实现了job接口的类,这个类就是我们自己实现的job导出类。

    3.初始定时任务的初始化类。作用:项目启动时,初始化自己定义的定时器。既然需要项目启动时就加载所有的定时器,那么需要在spring容器加载时一起加载。

     1 public class InitQuartzJob {
     2 
     3         /**
     4          * @throws SchedulerException
     5          * @Description:服务启动时,根据用户定义的推送规则,初始化所有的推送任务。每个用户选择自己的隧道,为每条隧道指定推送的间隔时间。 因此同一个用户可能有多个定时任务。
     6          */
     7         public static void init() throws SchedulerException {
     8             System.out.println("定时器初始化开始==============================");
     9 
    10             JobDataMap dataMap1 = new JobDataMap();
    11             dataMap1.put("subCode", "sdnanhuan");
    12             dataMap1.put("messageType", "all");
    13             JobKey jobKey1 = new JobKey("我的cron任务1", "我的cron任务组名1");
    14             TriggerKey triggerKey1 = new TriggerKey("我的cron触发器名1", "我的cron触发器组名1");
    15 
    16             JobKey jobKey2 = new JobKey("我的cron任务2", "我的cron任务组名1");// job的名字不能重复
    17             TriggerKey triggerKey2 = new TriggerKey("我的cron触发器名2", "我的cron触发器组名2");
    18 
    19             QuartzManager.addJob(jobKey1, triggerKey1, MyQuartzJob.class, "0 0/2 * * * ?", null);
    20             QuartzManager.addJob(jobKey2, triggerKey2, MyQuartzJob.class, "0 0/2 * * * ?", null);
    21 
    22 
    23         }
    24     }

    4.最后就是在自己的业务系统里面,调用定时器工具类了。当业务提交后,如果需要创建或者修改定时器,直接在业务层调用工具类就可以了。


    转载https://blog.csdn.net/Jatham/article/details/81384454

  • 相关阅读:
    解决问题:Jenkins Web 部署任务失败
    微信开发者调试工具官方下载地址
    Android机USB调试功能
    DOMContentLoaded 和 Load 和 Finish
    Json to string, string to Json
    static 和 new对象的区别
    c# Image/Pdf 预览
    在console 中执行异步方法
    c# 压缩zip
    js -- string 转 html
  • 原文地址:https://www.cnblogs.com/wjlwo2ni/p/10504745.html
Copyright © 2011-2022 走看看