springboot Quartz動態(tài)修改cron表達式的方法
1、概述: 在開發(fā)中有的時候需要去手動禁止和啟用定時任務,修改定時任務的cron表達式然后再讓其動態(tài)生效,之前有過SSM的類似的業(yè)務的開發(fā)但是忘記寫下來了。。。只好重新溫習了一次,加上最近比較流行springBoot所以升級了一下用springBoot來完成.
2、關聯(lián)技術 SpringBoot、Quartz、H2、thymeleaf (好像就這么多)
3、具體流程
1)首先去手動創(chuàng)建一個調度器工廠對象-SchedulerFactoryBean;其實應該不用手動創(chuàng)建的但是為了顧及到業(yè)務的復雜性所以還是創(chuàng)建一個好用。
@Bean
public SchedulerFactoryBean schedulerFactory(){
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
/*用于Quartz集群,啟動時更新已存在的Job*/
factoryBean.setOverwriteExistingJobs(true);
/*定時任務開始啟動后延遲5秒開始*/
factoryBean.setStartupDelay(5);
return factoryBean;
}
2)獲取到
//得到調度器 Scheduler scheduler = schedulerFactoryBean.getScheduler();
3)判斷是否有觸發(fā)器-trigger存在其中,因為有可能說上次的觸發(fā)器 并沒有刪除
//獲得觸發(fā)器 TriggerKey triggerKey = TriggerKey.triggerKey(config.getName(), config.getGroup()); CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
4)創(chuàng)建一個任務類需要繼承Job,實現(xiàn)方法execute。需要在其中執(zhí)行定時任務如下:
//注釋作用,當上一個任務未結束時下一個任務需進行等待
@DisallowConcurrentExecution
public class QuartzJobFactory implements Job {
public static final String SCHEDULEJOBKEY="scheduleJob";
//execute會根據cron的規(guī)則進行執(zhí)行
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Config config = (Config) jobExecutionContext.getMergedJobDataMap().get(SCHEDULEJOBKEY);
TaskUtils.invokMethod(config);
}
}
5)將執(zhí)行實例添加到任務當中去,我在例子是將執(zhí)行任務的信息封裝到了對象config當中然后在任務QuartzJobFactoryz中進行解讀的
public static void invokMethod(Config config){
Object obj=null;
Class clazz=null;
//通過Spring上下文去找 也有可能找不到
try {
obj= SpringUtils.getBean(config.getClassPath().split("\\.")[config.getClassPath().split("\\.").length - 1]);
if (obj == null){
clazz = Class.forName(config.getClassPath());
obj = clazz.newInstance();
}else{
clazz =obj.getClass();
}
}catch (Exception e){
throw new RuntimeException("ERROR:TaskUtils is Bean Create please check the classpath is`t right or not");
}
Method method=null;
//獲得方法名
try {
method = clazz.getDeclaredMethod(config.getMethodName());
} catch (NoSuchMethodException e) {
throw new RuntimeException("ERROR:TaskUtils is Bean the method Create please check the methodName is`t right or not");
}
//方法執(zhí)行
try {
method.invoke(obj);
} catch (Exception e) {
throw new RuntimeException("ERROR:TaskUtils is Bean the method execute please check the methodName is`t right or not");
}
}
6)創(chuàng)建觸發(fā)器并且綁定cron表達式
7)在調度器中將觸發(fā)器和任務進行組合 詳情見:com.study.www.service.QuartzTableservice.addJob
//將cron表達式進行轉換 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(config.getCron()); //創(chuàng)建觸發(fā)器并將cron表達式對象給塞入 trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); //在調度器中將觸發(fā)器和任務進行組合 scheduler.scheduleJob(jobDetail,trigger);
github:點擊打開鏈接
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)代碼
這篇文章主要介紹了Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下。2017-11-11
詳解Java的Struts框架中上傳文件和客戶端驗證的實現(xiàn)
這篇文章主要介紹了Java的Struts框架中上傳文件和客戶端驗證的實現(xiàn),Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12

