zoukankan      html  css  js  c++  java
  • Quartz设置动态Job

      在日常开发中,经常会遇到要设置动态job,这里做下记录。

      首先建立一个QuartzManager的管理类

      1 @Component("quartzManager")
      2 public class QuartzManager {
      3 
      4     //private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
      5 
      6     private static SchedulerFactoryBean schedulerFactoryBean;
      7 
      8     @Autowired
      9     public void setSchedulerFactoryBean(SchedulerFactoryBean schedulerFactoryBean){
     10         staticSetSchedulerFactoryBean(schedulerFactoryBean);
     11     }
     12 
     13     private static void staticSetSchedulerFactoryBean(SchedulerFactoryBean schedulerFactoryBean){
     14         QuartzManager.schedulerFactoryBean = schedulerFactoryBean;
     15     }
     16 
     17     /**
     18      * @Description: 添加一个定时任务
     19      * @param jobName
     20      *            任务名
     21      * @param triggerName
     22      *            触发器名
     23      * @param jobClass
     24      *            任务
     25      * @param cron
     26      *            时间设置,参考quartz说明文档
     27      */
     28     @SuppressWarnings({ "rawtypes", "unchecked" })
     29     public static void addJob(String jobName, String jobGroupName,
     30                               String triggerName, String triggerGroupName, Class jobClass, String cron) {
     31         try {
     32             Scheduler sched = schedulerFactoryBean.getScheduler();
     33             JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
     34             // 表达式调度构建器
     35             CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
     36             // 按新的cronExpression表达式构建一个新的trigger
     37             Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
     38                     .withSchedule(scheduleBuilder).build();
     39             sched.scheduleJob(job, trigger);
     40             // 启动
     41             if (!sched.isShutdown()) {
     42                 sched.start();
     43             }
     44         } catch (Exception e) {
     45             throw new RuntimeException(e);
     46         }
     47     }
     48 
     49     /**
     50      * @Description: 修改一个任务的触发时间
     51      * @param triggerName
     52      * @param cron
     53      */
     54     public static void modifyJobTime(String triggerName, String triggerGroupName, String cron) {
     55         TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
     56 
     57         try {
     58             Scheduler sched = schedulerFactoryBean.getScheduler();
     59             CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
     60             if (trigger == null) {
     61                 return;
     62             }
     63             String oldTime = trigger.getCronExpression();
     64             if (!oldTime.equalsIgnoreCase(cron)) {
     65                 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
     66                 // 按新的cronExpression表达式重新构建trigger
     67                 trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
     68                 // 按新的trigger重新设置job执行
     69                 sched.rescheduleJob(triggerKey, trigger);
     70             }
     71         } catch (Exception e) {
     72             throw new RuntimeException(e);
     73         }
     74     }
     75 
     76     /**
     77      * @Description:暂停一个任务(使用默认组名)
     78      * @param jobName
     79      */
     80     public static void pauseJob(String jobName ,String jobGroupName) {
     81         JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
     82         try {
     83             Scheduler sched = schedulerFactoryBean.getScheduler();
     84             sched.pauseJob(jobKey);
     85         } catch (SchedulerException e) {
     86             e.printStackTrace();
     87         }
     88     }
     89 
     90 
     91 
     92     /**
     93      * @Description:恢复一个任务(使用默认组名)
     94      * @param jobName
     95      */
     96     public static void resumeJob(String jobName,String jobGroupName) {
     97         JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
     98         try {
     99             Scheduler sched = schedulerFactoryBean.getScheduler();
    100             sched.resumeJob(jobKey);
    101         } catch (SchedulerException e) {
    102             e.printStackTrace();
    103         }
    104     }
    105 
    106     /**
    107      * @Description: 移除一个任务
    108      * @param jobName
    109      * @param triggerName
    110      */
    111     public static void removeJob(String jobName, String jobGroupName,
    112                                  String triggerName, String triggerGroupName) {
    113         TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
    114         JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
    115         try {
    116             Scheduler sched = schedulerFactoryBean.getScheduler();
    117             sched.pauseTrigger(triggerKey);// 停止触发器
    118             sched.unscheduleJob(triggerKey);// 移除触发器
    119             sched.deleteJob(jobKey);// 删除任务
    120         } catch (Exception e) {
    121             throw new RuntimeException(e);
    122         }
    123     }
    124 
    125     /**
    126      * @Description:启动所有定时任务
    127      */
    128     public static void startJobs() {
    129         try {
    130             Scheduler sched = schedulerFactoryBean.getScheduler();
    131             sched.start();
    132         } catch (Exception e) {
    133             throw new RuntimeException(e);
    134         }
    135     }
    136 
    137     /**
    138      * @Description 关闭所有定时任务
    139      */
    140     public static void shutdownJobs() {
    141         try {
    142             Scheduler sched = schedulerFactoryBean.getScheduler();
    143             if (!sched.isShutdown()) {
    144                 sched.shutdown();
    145             }
    146         } catch (Exception e) {
    147             throw new RuntimeException(e);
    148         }
    149     }
    150 
    151     /**
    152      * @Description: 立即运行任务,这里的立即运行,只会运行一次,方便测试时用。
    153      * @param jobName
    154      */
    155     public static void triggerJob(String jobName,String jobGroupName) {
    156         JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
    157         try {
    158             Scheduler sched = schedulerFactoryBean.getScheduler();
    159             sched.triggerJob(jobKey);
    160         } catch (SchedulerException e) {
    161             e.printStackTrace();
    162         }
    163     }
    164     /**
    165      * @Description: 获取任务状态
    166      *         NONE: 不存在
    167      *         NORMAL: 正常
    168      *         PAUSED: 暂停
    169      *         COMPLETE:完成
    170      *         ERROR : 错误
    171      *         BLOCKED : 阻塞
    172      * @param triggerName 触发器名
    173      */
    174     public static String getTriggerState(String triggerName, String triggerGroupName){
    175         TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
    176         String name = null;
    177         try {
    178             Scheduler sched = schedulerFactoryBean.getScheduler();
    179             TriggerState triggerState = sched.getTriggerState(triggerKey);
    180             name = triggerState.name();
    181         } catch (SchedulerException e) {
    182             e.printStackTrace();
    183         }
    184         return name;
    185     }
    186 
    187     /**
    188      * @Description:获取最近8次执行时间
    189      * @param cron
    190      */
    191     public static List<String> getRecentTriggerTime(String cron) {
    192         List<String> list = new ArrayList<String>();
    193         try {
    194             CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
    195             cronTriggerImpl.setCronExpression(cron);
    196             // 这个是重点,一行代码搞定
    197             List<Date> dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 8);
    198             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    199             for (Date date : dates) {
    200                 list.add(dateFormat.format(date));
    201             }
    202 
    203         } catch (ParseException e) {
    204             e.printStackTrace();
    205         }
    206         return list;
    207     }
    208 
    209 }
    View Code

      然后我们这里需要创建一个Job类,继承Job类,并重写execute(JobExecutionContext context),为动态job提供公用方法。

      

       最后一步,创建动态job,也可以提供QuartzManager进行删除哦!

      

       具体参数请参考QuartzManager中的注释说明。这样动态的Job就创建成功。

  • 相关阅读:
    WPF/MVVM 快速开始指南(译)
    Rose2003的安装和破解
    自定义vs代码段
    silverlight中Grid.ColumnDefinitions属性设置错误
    vs绑定和取消绑定项目和解决方案
    firefox浏览器中silverlight无法输入问题
    silverlight中当前上下文中不存在名称“InitializeComponent“错误
    inotify使用代码
    build android toochain on mac (gcc 4.4.3 compile)
    istat 一个不错的widget
  • 原文地址:https://www.cnblogs.com/shawn-sun/p/14450851.html
Copyright © 2011-2022 走看看