专栏首页一个会写诗的程序员的博客Spring 实现 SchedulingConfigurer 接口完成动态定时任务(配合数据库动态执行)

Spring 实现 SchedulingConfigurer 接口完成动态定时任务(配合数据库动态执行)

Spring 实现 SchedulingConfigurer 接口完成动态定时任务(配合数据库动态执行)

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.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;

@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {

    @Mapper
    public interface CronMapper {
        @Select("select cron from cron limit 1")
        String getCron();
    }

    @Autowired
    @SuppressWarnings("all")
    CronMapper cronMapper;

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () -> System.out.println("执行定时任务2: " + LocalDateTime.now().toLocalTime()),
                //2.设置执行周期(Trigger)
                triggerContext -> {
                    //2.1 从数据库获取执行周期
                    String cron = cronMapper.getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
                        // Omitted Code ..
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}

源码:

https://github.com/yizhiwazi/springboot-socks/blob/master/springboot-schedule-task/src/main/java/com/hehe/config/CompleteScheduleConfig.java

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《Spring Boot极简教程》第16章 Spring Boot安全集成Spring Security小结

    开发Web应用,对页面的安全控制通常是必须的。比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以...

    一个会写诗的程序员
  • JPA 执行update/delete query 需要加上事务

    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Executing...

    一个会写诗的程序员
  • 8.6 Spring Boot集成Spring Security小结

    开发Web应用,对页面的安全控制通常是必须的。比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以...

    一个会写诗的程序员
  • @EnableDiscoveryClient和@EnableEurekaClient的区别?

    @EnableDiscoveryClient和@EnableEurekaClient的区别?在前面的服务提供者的例子中我们是用@EnableEurekaClie...

    马克java社区
  • SpringCloud gateway跨域配置

    天涯泪小武
  • Mybatis+Thymeleaf前端显示时间格式问题解决方法

    我的开发工具是IntelliJ IDEA,然后在SpringBoot集成Mybatis,前端用模块引擎Thymeleaf的过程中遇到几个问题,不过也花了点时间,...

    SmileNicky
  • 解释一下Spring框架AOP(面向切面编程)

    文章开头我先把上一期spring事物这篇文章(spring事物管理)最后的问题解答一下:

    Java编程指南
  • SpringBoot开发案例之整合mail队列进阶篇

    前情提要 上一篇文章,我们为了解决实际场景中遇到的问题,使得其更像一个安全高效的邮件服务平台,我们引入了LinkedBlockingQueue队列对邮件发送进行...

    小柒2012
  • SpringBoot开发案例之整合mail队列进阶篇

    上一篇文章,我们为了解决实际场景中遇到的问题,使得其更像一个安全高效的邮件服务平台,我们引入了LinkedBlockingQueue队列对邮件发送进行流量削锋、...

    小柒2012
  • Spring Cloud Gateway 读取、修改请求体(解决request body内容被截断)

    微服务架构,在网关服务里拦截每个请求,进行日志信息记录与管理,发现当请求体过长时,只能获取到一部分body,查看拦截过滤器,发现Spring Cloud Gat...

    一滴水的眼泪

扫码关注云+社区

领取腾讯云代金券