在日常开发中,经常会遇到要设置动态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 }
然后我们这里需要创建一个Job类,继承Job类,并重写execute(JobExecutionContext context),为动态job提供公用方法。
最后一步,创建动态job,也可以提供QuartzManager进行删除哦!
具体参数请参考QuartzManager中的注释说明。这样动态的Job就创建成功。