springboot Quartz動態(tài)修改cron表達(dá)式的方法
1、概述: 在開發(fā)中有的時(shí)候需要去手動禁止和啟用定時(shí)任務(wù),修改定時(shí)任務(wù)的cron表達(dá)式然后再讓其動態(tài)生效,之前有過SSM的類似的業(yè)務(wù)的開發(fā)但是忘記寫下來了。。。只好重新溫習(xí)了一次,加上最近比較流行springBoot所以升級了一下用springBoot來完成.
2、關(guān)聯(lián)技術(shù) SpringBoot、Quartz、H2、thymeleaf (好像就這么多)
3、具體流程
1)首先去手動創(chuàng)建一個(gè)調(diào)度器工廠對象-SchedulerFactoryBean;其實(shí)應(yīng)該不用手動創(chuàng)建的但是為了顧及到業(yè)務(wù)的復(fù)雜性所以還是創(chuàng)建一個(gè)好用。
@Bean
public SchedulerFactoryBean schedulerFactory(){
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
/*用于Quartz集群,啟動時(shí)更新已存在的Job*/
factoryBean.setOverwriteExistingJobs(true);
/*定時(shí)任務(wù)開始啟動后延遲5秒開始*/
factoryBean.setStartupDelay(5);
return factoryBean;
}
2)獲取到
//得到調(diào)度器 Scheduler scheduler = schedulerFactoryBean.getScheduler();
3)判斷是否有觸發(fā)器-trigger存在其中,因?yàn)橛锌赡苷f上次的觸發(fā)器 并沒有刪除
//獲得觸發(fā)器 TriggerKey triggerKey = TriggerKey.triggerKey(config.getName(), config.getGroup()); CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
4)創(chuàng)建一個(gè)任務(wù)類需要繼承Job,實(shí)現(xiàn)方法execute。需要在其中執(zhí)行定時(shí)任務(wù)如下:
//注釋作用,當(dāng)上一個(gè)任務(wù)未結(jié)束時(shí)下一個(gè)任務(wù)需進(jìn)行等待
@DisallowConcurrentExecution
public class QuartzJobFactory implements Job {
public static final String SCHEDULEJOBKEY="scheduleJob";
//execute會根據(jù)cron的規(guī)則進(jìn)行執(zhí)行
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Config config = (Config) jobExecutionContext.getMergedJobDataMap().get(SCHEDULEJOBKEY);
TaskUtils.invokMethod(config);
}
}
5)將執(zhí)行實(shí)例添加到任務(wù)當(dāng)中去,我在例子是將執(zhí)行任務(wù)的信息封裝到了對象config當(dāng)中然后在任務(wù)QuartzJobFactoryz中進(jìn)行解讀的
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表達(dá)式
7)在調(diào)度器中將觸發(fā)器和任務(wù)進(jìn)行組合 詳情見:com.study.www.service.QuartzTableservice.addJob
//將cron表達(dá)式進(jìn)行轉(zhuǎn)換 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(config.getCron()); //創(chuàng)建觸發(fā)器并將cron表達(dá)式對象給塞入 trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); //在調(diào)度器中將觸發(fā)器和任務(wù)進(jìn)行組合 scheduler.scheduleJob(jobDetail,trigger);
github:點(diǎn)擊打開鏈接
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot項(xiàng)目使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的方法
- SpringBoot的@Scheduled和@Schedules區(qū)別小結(jié)
- SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動時(shí)執(zhí)行一次
- @Scheduled在springboot中的使用方式
- springboot實(shí)現(xiàn)定時(shí)任務(wù)@Scheduled方式
- SpringBoot中@Scheduled()注解以及cron表達(dá)式詳解
- SpringBoot?@Scheduled?Cron表達(dá)式使用方式
相關(guān)文章
JAVA重復(fù)調(diào)用接口導(dǎo)致數(shù)據(jù)不一致的問題解決
在使用JAVA進(jìn)行開發(fā)時(shí),我們經(jīng)常會遇到要調(diào)用接口來獲取數(shù)據(jù)的情況,本文主要介紹了JAVA重復(fù)調(diào)用接口導(dǎo)致數(shù)據(jù)不一致的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
使用JAVA實(shí)現(xiàn)高并發(fā)無鎖數(shù)據(jù)庫操作步驟分享
一個(gè)在線2k的游戲,每秒鐘并發(fā)都嚇?biāo)廊?。傳統(tǒng)的hibernate直接插庫基本上是不可行的。我就一步步推導(dǎo)出一個(gè)無鎖的數(shù)據(jù)庫操作,詳情看下文2013-11-11
springboot jpa分庫分表項(xiàng)目實(shí)現(xiàn)過程詳解
這篇文章主要介紹了springboot jpa分庫分表項(xiàng)目實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Hibernate中使用HQLQuery查詢?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實(shí)例
今天小編就為大家分享一篇關(guān)于Hibernate中使用HQLQuery查詢?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
關(guān)于Map的遍歷以及轉(zhuǎn)JsonArray存儲方式
在Java開發(fā)過程中,經(jīng)常會遇到需要對復(fù)雜數(shù)據(jù)結(jié)構(gòu)進(jìn)行處理的情況,本案例以List<Map<String,Object>>為例,介紹了如何遍歷該數(shù)據(jù)結(jié)構(gòu),并根據(jù)特定條件篩選出符合要求的元素,通過自定義一個(gè)Edit類來模擬形成一個(gè)新的Map對象,實(shí)現(xiàn)了數(shù)據(jù)的有序存儲2024-11-11
Java實(shí)現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件
與TXT文本文件,PDF文件更加專業(yè)也更適合傳輸,所以這篇文章小編主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件 ,需要的可以參考下2024-02-02

