SpringBoot实现动态定时任务

 更新时间:2020年09月24日 15:29:46   作者:我滴太阳233  
这篇文章主要为大家详细介绍了SpringBoot实现动态定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

项目情况:

在当前项目中需要一个定时任务来清除过期的校验码,如果使用数据库存储过程的话不方便维护。因此采用SpringBoot自带的方式来设置定时任务。

技术说明:

SpringBoot自带的方式有两种可以实现:

一种是使用@Scheduled注解的方式,只需要在启动类或者它所在的类上添加@EnableScheduling注解允许执行定时任务,并且设置Schecduled注解的参数,诸如:

        1.cron是设置定时执行的表达式,如 0 0/5 * * * ?每隔五分钟执行一次

        2.zone表示执行时间的时区

        3.fixedDelay 和fixedDelayString 表示一个固定延迟时间执行,上个任务完成后,延迟多长时间执行

        4.fixedRate 和fixedRateString表示一个固定频率执行,上个任务开始后,多长时间后开始执行

        5.initialDelay 和initialDelayString表示一个初始延迟时间,第一次被调用前延迟的时间

示例代码如下:

package com.allcom.service;
 
import com.allcom.dao.MysqlDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
 
/**
* @Author: zy
* @Description: 定时任务
* @Date: 2018/7/12_15:15
**/
@Service
public class TaskService {
 
 @Autowired
 private MysqlDao mysqlDao;
 
 @Scheduled(fixedRate = 5*1000)
 public void deleteInvalidCheckCode() {
  mysqlDao.deleteInvalidCheckCode();
 }
 
}

另一种方式是通过自定义配置类的方式,步骤如下:

第一步:新建一个类实现SchedulingConfigurer接口,并添加@Configuration注解,@EnableScheduling注解可以写在这里也可以写在启动类上,这里我写在了启动类上。

第二步: 重写configureTasks方法如下代码所示:

package com.allcom.task;
 
import com.allcom.service.TaskService;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
 
 
 
import java.util.Date;
 
 
@Configuration
public class MyScheduledTask implements SchedulingConfigurer {
 
 @Mapper
 public interface CronMapper {
  @Select("select cron from user_cron limit 1")
  String getCron();
 }
 
 @Autowired
 @SuppressWarnings("all")
 CronMapper cronMapper;
 
 
 @Autowired
 @SuppressWarnings("all")
 private TaskService taskService;
 
 @Override
 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
   scheduledTaskRegistrar.addTriggerTask(new Runnable() {
    @Override
    public void run() {
     try {
      taskService.deleteInvalidCheckCode(); //异步定时操作
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
   }, new Trigger() {
    @Override
    public Date nextExecutionTime(TriggerContext triggerContext) {
     String cron =cronMapper.getCron();
     if("".equals(cron)||cron==null)
      return null;
     //定时任务触发,可修改定时任务的执行周期
     CronTrigger trigger=new CronTrigger(cron);
     Date nextExecDate= trigger.nextExecutionTime(triggerContext);
     return nextExecDate;
    }
   });
 }
}

第三步:启动项目,定时任务就自动添加了。

注意:这里我使用的是@Mapper注解使用Mybatis写了一个获取cron表达式的接口,可以从数据库中查询自定义表的cron字段值。这样的话项目运行的过程中,不用重新启动项目,只需要修改数据库中的字段值就可以动态的修改定时任务中的cron值,实现动态修改定时任务执行时间的功能。

但是,这种方式有一个缺点就是,将数据库cron字段值设为null或者“”以及不正确的值,这样定时任务就会停止执行,这样就算你下一次再给cron字段添加了正确的值,项目也不会执行定时任务了,这个时候就需要重新启动数据库才行。

这种方式适合于前台给几个特定的值给用户选择,不能让用户随便填。

附定时任务执行内容:

/**
* @Author: zy
* @Description: 删除用户过期的校验码
* @Date: 2018/7/12_15:20
**/
@Delete("DELETE from registinfo where id in (select id from (SELECT id FROM registinfo WHERE TIMESTAMPDIFF(MINUTE,lastupdatetime,NOW()) >= 15)a )")
void deleteInvalidCheckCode();

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

相关文章

  • Java日常练习题,每天进步一点点(4)

    Java日常练习题,每天进步一点点(4)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java中的MapStruct知识点总结

    Java中的MapStruct知识点总结

    这篇文章主要介绍了Java中的MapStruct知识点总结,MapStruct是一个Java注解处理器,用于生成类型安全的映射代码,它可以自动处理源对象和目标对象之间的映射,减少了手动编写重复的映射代码的工作量,需要的朋友可以参考下
    2023-10-10
  • Java获取泛型实际类型的方法详解

    Java获取泛型实际类型的方法详解

    这篇文章主要介绍了Java获取泛型实际类型的方法详解,泛型,即“参数化类型”,一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数,需要的朋友可以参考下
    2023-11-11
  • Java 实战范例之线上新闻平台系统的实现

    Java 实战范例之线上新闻平台系统的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+jsp+jdbc+mysql实现一个线上新闻平台系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • java获取指定开始时间与结束时间之间的所有日期

    java获取指定开始时间与结束时间之间的所有日期

    这篇文章主要为大家详细介绍了java获取指定开始时间与结束时间之间的所有日期,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 快速入门HarmonyOS的Java UI框架的教程

    快速入门HarmonyOS的Java UI框架的教程

    这篇文章主要介绍了快速入门HarmonyOS的Java UI框架,本文给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • MyBatis ofType和javaType的区别说明

    MyBatis ofType和javaType的区别说明

    这篇文章主要介绍了MyBatis ofType和javaType的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot整合阿里 Druid 数据源的实例详解

    SpringBoot整合阿里 Druid 数据源的实例详解

    这篇文章主要介绍了SpringBoot整合阿里 Druid 数据源,主要讲解了手动配置方法,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • java之map集合存放null值的问题

    java之map集合存放null值的问题

    这篇文章主要介绍了java之map集合存放null值的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Springboot项目长时间不进行接口操作,提示HikariPool-1警告的解决

    Springboot项目长时间不进行接口操作,提示HikariPool-1警告的解决

    这篇文章主要介绍了Springboot项目长时间不进行接口操作,提示HikariPool-1警告的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论