1、概述: 在開發中有的時候需要去手動禁止和啟用定時任務,修改定時任務的cron表達式然后再讓其動態生效,之前有過ssm的類似的業務的開發但是忘記寫下來了。。。只好重新溫習了一次,加上最近比較流行springboot所以升級了一下用springboot來完成.
2、關聯技術 springboot、quartz、h2、thymeleaf (好像就這么多)
3、具體流程
1)首先去手動創建一個調度器工廠對象-schedulerfactorybean;其實應該不用手動創建的但是為了顧及到業務的復雜性所以還是創建一個好用。
1
2
3
4
5
6
7
8
9
|
@bean public schedulerfactorybean schedulerfactory(){ schedulerfactorybean factorybean = new schedulerfactorybean(); /*用于quartz集群,啟動時更新已存在的job*/ factorybean.setoverwriteexistingjobs(true); /*定時任務開始啟動后延遲5秒開始*/ factorybean.setstartupdelay( 5 ); return factorybean; } |
2)獲取到
1
2
|
//得到調度器 scheduler scheduler = schedulerfactorybean.getscheduler(); |
3)判斷是否有觸發器-trigger存在其中,因為有可能說上次的觸發器 并沒有刪除
1
2
3
|
//獲得觸發器 triggerkey triggerkey = triggerkey.triggerkey(config.getname(), config.getgroup()); crontrigger trigger = (crontrigger)scheduler.gettrigger(triggerkey); |
4)創建一個任務類需要繼承job,實現方法execute。需要在其中執行定時任務如下:
1
2
3
4
5
6
7
8
9
10
11
|
//注釋作用,當上一個任務未結束時下一個任務需進行等待 @disallowconcurrentexecution public class quartzjobfactory implements job { public static final string schedulejobkey= "schedulejob" ; //execute會根據cron的規則進行執行 @override public void execute(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception { config config = (config) jobexecutioncontext.getmergedjobdatamap().get(schedulejobkey); taskutils.invokmethod(config); } } |
5)將執行實例添加到任務當中去,我在例子是將執行任務的信息封裝到了對象config當中然后在任務quartzjobfactoryz中進行解讀的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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" ); } //方法執行 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)創建觸發器并且綁定cron表達式
7)在調度器中將觸發器和任務進行組合 詳情見:com.study.www.service.quartztableservice.addjob
1
2
3
4
5
6
|
//將cron表達式進行轉換 cronschedulebuilder cronschedulebuilder = cronschedulebuilder.cronschedule(config.getcron()); //創建觸發器并將cron表達式對象給塞入 trigger = triggerbuilder.newtrigger().withidentity(triggerkey).withschedule(cronschedulebuilder).build(); //在調度器中將觸發器和任務進行組合 scheduler.schedulejob(jobdetail,trigger); |
github:點擊打開鏈接
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/zhu714702382/article/details/79391437