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();

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

相关文章

  • SpringCloud实现基于RabbitMQ消息队列的详细步骤

    SpringCloud实现基于RabbitMQ消息队列的详细步骤

    在Spring Cloud框架中,我们可以利用RabbitMQ实现强大而可靠的消息队列系统,本篇将详细介绍如何在Spring Cloud项目中集成RabbitMQ,并创建一个简单的消息队列,感兴趣的朋友一起看看吧
    2024-03-03
  • java支付宝即时到帐提交订单功能

    java支付宝即时到帐提交订单功能

    这篇文章主要为大家详细介绍了java支付宝即时到帐提交订单功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java封装数组之改进为泛型数组操作详解

    Java封装数组之改进为泛型数组操作详解

    这篇文章主要介绍了Java封装数组之改进为泛型数组操作,结合实例形式详细分析了Java封装数组为泛型数组相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2020-03-03
  • 详解Java中Iterable与Iterator用法

    详解Java中Iterable与Iterator用法

    在本文中小编给大家分享了关于Java中Iterable与Iterator的用法知识点内容,有兴趣的朋友们可以学习下。
    2018-10-10
  • SpringMVC核心DispatcherServlet处理流程分步详解

    SpringMVC核心DispatcherServlet处理流程分步详解

    这篇文章主要介绍了SpringMVC核心之中央调度器DispatcherServlet的相关知识,包括SpringMVC请求处理过程及SrpingMVC容器和spring IOC容器关系,需要的朋友可以参考下
    2023-04-04
  • Springboot设置文件上传大小限制的实现示例

    Springboot设置文件上传大小限制的实现示例

    Spring Boot工程嵌入的tomcat限制了请求的文件大小默认为1MB,单次请求的文件的总数不能大于10Mb,本文主要介绍了Springboot设置文件上传大小限制的实现示例,感兴趣的可以了解一下
    2023-11-11
  • Java实现多数据源的几种方式总结

    Java实现多数据源的几种方式总结

    这篇文章主要给大家总结介绍了关于Java实现多数据源的几种方式,最近项目中的工作流需要查询多个数据源的数据,数据源可能是不同种类的,需要的朋友可以参考下
    2023-08-08
  • Spring Boot 中PageHelper 插件使用配置思路详解

    Spring Boot 中PageHelper 插件使用配置思路详解

    这篇文章主要介绍了Spring Boot 中PageHelper 插件使用配置及实现思路,通过引入myabtis和pagehelper依赖,在yml中配置mybatis扫描和实体类,具体实现方法跟随小编一起看看吧
    2021-08-08
  • Spring系列之事物管理

    Spring系列之事物管理

    这篇文章主要介绍了Spring系列之事物管理,文中通过示例代码介绍的非常详细,对大家学习或者使用spring方面知识具有一定的参考学习价值,需要的朋友们一起学习学习吧
    2021-09-09
  • java编程SpringSecurity入门原理及应用简介

    java编程SpringSecurity入门原理及应用简介

    Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案
    2021-09-09

最新评论