日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot-quartz工程动态调度的实现

發(fā)布時(shí)間:2024/4/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot-quartz工程动态调度的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳統(tǒng)的 Spring方式集成,由于任務(wù)信息全部配置在 xml文件中,如果需要操作任務(wù)或者修改任務(wù)運(yùn)行頻率,只能重新編譯、打包、部署、重啟,如果有緊急問題需要處理,會浪費(fèi)很多的時(shí)間。

有沒有可以動態(tài)調(diào)度任務(wù)的方法?比如停止一個(gè) Job?啟動一個(gè) Job?修改 Job的觸發(fā)頻率?

讀取配置文件、寫入配置文件、重啟 Scheduler或重啟應(yīng)用明顯是不可取的。

對于這種頻繁變更并且需要實(shí)時(shí)生效的配置信息,我們可以放到哪里?ZK、Redis、DB tables。

并且,我們可以提供一個(gè)界面,實(shí)現(xiàn)對數(shù)據(jù)表的輕松操作。?

配置管理

這里我們用最簡單的數(shù)據(jù)庫的實(shí)現(xiàn)。

問題?
1:建一張什么樣的表?參考 JobDetail的屬性。?

CREATE TABLE `sys_job` (?`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',?`job_name` varchar(512) NOT NULL COMMENT '任務(wù)名稱 ',?`job_group` varchar(512) NOT NULL COMMENT '任務(wù)組名 ',?`job_cron` varchar(512) NOT NULL COMMENT '時(shí)間表達(dá)式 ',?`job_class_path` varchar(1024) NOT NULL COMMENT '類路徑 ,全類型 ',?`job_data_map` varchar(1024) DEFAULT NULL COMMENT '傳遞 map參數(shù) ',?`job_status` int(2) NOT NULL COMMENT '狀態(tài) :1啟用 0停用 ',?`job_describe` varchar(1024) DEFAULT NULL COMMENT '任務(wù)功能描述 ',?PRIMARY KEY (`id`)? ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;?

數(shù)據(jù)操作與任務(wù)調(diào)度

操作數(shù)據(jù)表非常簡單,SSM增刪改查。

但是在修改了表的數(shù)據(jù)之后,怎么讓調(diào)度器知道呢?

調(diào)度器的接口:Scheduler

在我們的需求中,我們需要做的事情:
1、新增一個(gè)任務(wù)
2、刪除一個(gè)任務(wù)
3、啟動、停止一個(gè)任務(wù)
4、修改任務(wù)的信息(包括調(diào)度規(guī)律)

因此可以把相關(guān)的操作封裝到一個(gè)工具類中。

public class SchedulerUtil {private static Logger logger = LoggerFactory.getLogger(SchedulerUtil.class);/*** 新增定時(shí)任務(wù)* @param jobClassName 類路徑* @param jobName 任務(wù)名稱* @param jobGroupName 組別* @param cronExpression Cron表達(dá)式* @param jobDataMap 需要傳遞的參數(shù)* @throws Exception*/public static void addJob(String jobClassName,String jobName, String jobGroupName, String cronExpression,String jobDataMap) throws Exception {// 通過SchedulerFactory獲取一個(gè)調(diào)度器實(shí)例SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = sf.getScheduler();// 啟動調(diào)度器scheduler.start();// 構(gòu)建job信息JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobName, jobGroupName).build();// JobDataMap用于傳遞任務(wù)運(yùn)行時(shí)的參數(shù),比如定時(shí)發(fā)送郵件,可以用json形式存儲收件人等等信息if (StringUtils.isNotEmpty(jobDataMap)) {JSONObject jb = JSONObject.parseObject(jobDataMap);Map<String, Object> dataMap =(Map<String, Object>) jb.get("data");for (Map.Entry<String, Object> m:dataMap.entrySet()) {jobDetail.getJobDataMap().put(m.getKey(),m.getValue());}}// 表達(dá)式調(diào)度構(gòu)建器(即任務(wù)執(zhí)行的時(shí)間)CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);// 按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(scheduleBuilder).startNow().build();try {scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {logger.info("創(chuàng)建定時(shí)任務(wù)失敗" + e);throw new Exception("創(chuàng)建定時(shí)任務(wù)失敗");}}/*** 停用一個(gè)定時(shí)任務(wù)* @param jobName 任務(wù)名稱* @param jobGroupName 組別* @throws Exception*/public static void jobPause(String jobName, String jobGroupName) throws Exception {// 通過SchedulerFactory獲取一個(gè)調(diào)度器實(shí)例SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = sf.getScheduler();scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));}/*** 啟用一個(gè)定時(shí)任務(wù)* @param jobName 任務(wù)名稱* @param jobGroupName 組別* @throws Exception*/public static void jobresume(String jobName, String jobGroupName) throws Exception {// 通過SchedulerFactory獲取一個(gè)調(diào)度器實(shí)例SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = sf.getScheduler();scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));}/*** 刪除一個(gè)定時(shí)任務(wù)* @param jobName 任務(wù)名稱* @param jobGroupName 組別* @throws Exception*/public static void jobdelete(String jobName, String jobGroupName) throws Exception {// 通過SchedulerFactory獲取一個(gè)調(diào)度器實(shí)例SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = sf.getScheduler();scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));}/*** 更新定時(shí)任務(wù)表達(dá)式* @param jobName 任務(wù)名稱* @param jobGroupName 組別* @param cronExpression Cron表達(dá)式* @throws Exception*/public static void jobReschedule(String jobName, String jobGroupName, String cronExpression) throws Exception {try {SchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);// 表達(dá)式調(diào)度構(gòu)建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);// 按新的cronExpression表達(dá)式重新構(gòu)建triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).startNow().build();// 按新的trigger重新設(shè)置job執(zhí)行scheduler.rescheduleJob(triggerKey, trigger);} catch (SchedulerException e) {System.out.println("更新定時(shí)任務(wù)失敗" + e);throw new Exception("更新定時(shí)任務(wù)失敗");}}/*** 檢查Job是否存在* @throws Exception*/public static Boolean isResume(String jobName, String jobGroupName) throws Exception {SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = sf.getScheduler();TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);Boolean state = scheduler.checkExists(triggerKey);return state;}/*** 暫停所有任務(wù)* @throws Exception*/public static void pauseAlljob() throws Exception {SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = sf.getScheduler();scheduler.pauseAll();}/*** 喚醒所有任務(wù)* @throws Exception*/public static void resumeAlljob() throws Exception {SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();sched.resumeAll();}/*** 獲取Job實(shí)例* @param classname* @return* @throws Exception*/public static BaseJob getClass(String classname) throws Exception {try {Class<?> c = Class.forName(classname);return (BaseJob) c.newInstance();} catch (Exception e) {throw new Exception("類["+classname+"]不存在!");}}}

?

總結(jié)

以上是生活随笔為你收集整理的springboot-quartz工程动态调度的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。