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就创建成功。

原文地址:https://www.cnblogs.com/shawn-sun/p/14450851.html