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

 更新时间:2018年09月29日 10:21:21   作者:追风的独角鲸  
这篇文章主要介绍了springboot Quartz动态修改cron表达式的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、概述: 在开发中有的时候需要去手动禁止和启用定时任务,修改定时任务的cron表达式然后再让其动态生效,之前有过SSM的类似的业务的开发但是忘记写下来了。。。只好重新温习了一次,加上最近比较流行springBoot所以升级了一下用springBoot来完成.

2、关联技术 SpringBoot、Quartz、H2、thymeleaf (好像就这么多)

3、具体流程      

1)首先去手动创建一个调度器工厂对象-SchedulerFactoryBean;其实应该不用手动创建的但是为了顾及到业务的复杂性所以还是创建一个好用。

 @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)判断是否有触发器-trigger存在其中,因为有可能说上次的触发器 并没有删除

//获得触发器
TriggerKey triggerKey = TriggerKey.triggerKey(config.getName(), config.getGroup());
CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);

4)创建一个任务类需要继承Job,实现方法execute。需要在其中执行定时任务如下:

//注释作用,当上一个任务未结束时下一个任务需进行等待
@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中进行解读的

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

  //将cron表达式进行转换    
  CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(config.getCron());   
  //创建触发器并将cron表达式对象给塞入
  trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
  //在调度器中将触发器和任务进行组合
  scheduler.scheduleJob(jobDetail,trigger);

github:点击打开链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVA重复调用接口导致数据不一致的问题解决

    JAVA重复调用接口导致数据不一致的问题解决

    在使用JAVA进行开发时,我们经常会遇到要调用接口来获取数据的情况,本文主要介绍了JAVA重复调用接口导致数据不一致的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 使用JAVA实现高并发无锁数据库操作步骤分享

    使用JAVA实现高并发无锁数据库操作步骤分享

    一个在线2k的游戏,每秒钟并发都吓死人。传统的hibernate直接插库基本上是不可行的。我就一步步推导出一个无锁的数据库操作,详情看下文
    2013-11-11
  • IDEA main主函数如何添加args变量

    IDEA main主函数如何添加args变量

    这篇文章主要介绍了IDEA main主函数如何添加args变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • springboot jpa分库分表项目实现过程详解

    springboot jpa分库分表项目实现过程详解

    这篇文章主要介绍了springboot jpa分库分表项目实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解Spring 延迟初始化遇到的问题

    详解Spring 延迟初始化遇到的问题

    这篇文章主要介绍了我们在使用Spring延迟初始化容易遇到的问题,文中有详细的代码示例,具有一定的参考价值,需要的可以借鉴一下
    2023-05-05
  • Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例

    Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例

    今天小编就为大家分享一篇关于Hibernate中使用HQLQuery查询全部数据和部分数据的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 浅谈Java并发之同步器设计

    浅谈Java并发之同步器设计

    这篇文章主要介绍Java并发之同步器设计,本文以记录方式并发编程中同步器设计的一些共性特征。并简单介绍了Java中的AQS,需要的朋友可以参考一下文章的详细内容
    2021-10-10
  • 关于Map的遍历以及转JsonArray存储方式

    关于Map的遍历以及转JsonArray存储方式

    在Java开发过程中,经常会遇到需要对复杂数据结构进行处理的情况,本案例以List<Map<String,Object>>为例,介绍了如何遍历该数据结构,并根据特定条件筛选出符合要求的元素,通过自定义一个Edit类来模拟形成一个新的Map对象,实现了数据的有序存储
    2024-11-11
  • Java实现将TXT文本文件转换为PDF文件

    Java实现将TXT文本文件转换为PDF文件

    与TXT文本文件,PDF文件更加专业也更适合传输,所以这篇文章小编主要为大家详细介绍了如何使用Java实现将TXT文本文件转换为PDF文件 ,需要的可以参考下
    2024-02-02
  • Java基础之Maven详解

    Java基础之Maven详解

    这篇文章主要介绍了Java基础之Maven详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论