服务器之家

服务器之家 > 正文

springboot Quartz动态修改cron表达式的方法

时间:2021-06-02 13:58     来源/作者:追风的独角鲸

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

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部