IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot实践(十四):设置定时任务ScheduleTask -> 正文阅读

[Java知识库]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());
    }
}

?动态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);
                }
        );
    }

}

输出

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:11:30  更:2021-09-14 13:11:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:04:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码