SpringBoot实践(十四):设置定时任务ScheduleTask

在数据处理场景中经常用到定时对数据ETL操作,springboot原生带有的ScheduleTask也可以提供丰富的定时任务操作,这里简单介绍集成使用,如果业务不复杂只是简单的定时执行任务则直接使用注解,若涉及到定时任务本身的变动(比如动态地读取库中crontab等)需要定制化地设计ScheduleTask类,按照上述描述可以分类静态定时任务和动态定时任务;

目录

静态ScheduleTask

动态ScheduleTask

模拟cron信息

定时任务配置

输出


静态ScheduleTask

静态ScheduleTask指的是crontab本身设置不变动,固定的周期设置,此种动态方法直接在应用接口上增加注释即可,比如每7秒打印一句话,或者每7秒完成一次接口调用;

package com.yzg.demo.config.Schedule;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.LocalDateTime;

@Configuration
// 定时任务
@EnableScheduling
public class ScheduleTaskOne {
    private final Logger logger= LoggerFactory.getLogger(ScheduleTaskOne.class);
    // 秒分时日月周
    @Scheduled(cron = "0/7 * * * * ?")
    private void configureTasks() {
        logger.info("定时任务每7秒打印: " + LocalDateTime.now());
    }
}

SpringBoot实践(十四):设置定时任务ScheduleTask

 动态ScheduleTask

 静态的调度器需要重启应用,当我们需要在前端提供用户自定义的crontab任务时,就需要读取库里的数据库信息拿到cron信息,然后按照动态地cron调用接口,不需要重启应用,这就需要定制化的设计ScheduleTask配置类;

模拟cron信息

用户自定义的crontab信息;

package com.yzg.demo.model;

public class Crontable {
    public int id;
    public String info;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public Crontable(int id, String info) {
        this.id = id;
        this.info = info;
    }
}

定时任务配置

当然一般不在配置类中写接口调用,这里这是测试写法,读取库里的crontab信息后,调用teacherimpl的查询方法,修改库里的cron信息后,任务相应地会改变;

package com.yzg.demo.config.Schedule;

import com.yzg.demo.service.CrontableImpl;
import com.yzg.demo.service.TeacherServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
import java.util.concurrent.ExecutionException;

@Configuration
@EnableScheduling
public class ScheduleTaskTwo implements SchedulingConfigurer {

    @Autowired
    TeacherServiceImpl teacherimpl; //实际业务操作

    @Autowired
    CrontableImpl crontableImpl; //读取数据库crontab操作

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        final Logger logger= LoggerFactory.getLogger(ScheduleTaskTwo.class);

        taskRegistrar.addTriggerTask(
                () -> {
                    // 从数据库读取corntabl配置
                    logger.info("模拟读取数据库中的crontab配置: " + LocalDateTime.now().toLocalTime());
                    try {
                        // 执行定时的接口任务
                        logger.info(teacherimpl.getStudents().get().get(0).toString());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                },
                triggerContext -> {
                    String cron = crontableImpl.getCronInfo();
                    if (StringUtils.isEmpty(cron)) {
                    }
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}

输出

SpringBoot实践(十四):设置定时任务ScheduleTask

上一篇:【odoo】【知识杂谈】单一实例多库模式下定时任务的问题分析


下一篇:【Java】Cron表达式