Spring Task定时任务的实现详解

 更新时间:2022年08月10日 10:55:21   作者:小薛的BUG日志  
这篇文章主要介绍了SpringBoot定时任务功能详细解析,这次的功能开发过程中也算是对其内涵的进一步了解,以后遇到定时任务的处理也更清晰,更有效率了,对SpringBoot定时任务相关知识感兴趣的朋友一起看看吧

Spring Task定时任务

Cron表达式

以6-7位的一组数字,中间用空格间隔的字符串,表达一种时间

每位的含义及取值范围:

秒(0-59) 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(1-7或SUN-SAT) 年(四位数,可省略)

符号的含义:

  1. *表示所有值(秒位是*,则表示每秒)
  2. ?表示未说明的值,(日和周必须有一位为?,因为不合逻辑)
  3. -表示一个指定的范围
  4. ,表示一个可能值
  5. /符号前表示开始时间,符号后表示每次递增的值
  6. L最后的,在’天’上表示这个月最后一天,用在’周’上表示’7或SUN’,在周上与数字一起,如"7L"表示这个月的最后一个周六(阿麦利卡日历,1表示周日)
  7. W只能用在’天’上, 用来描叙最接近指定天的工作日(周一到周五) ,如"15W"指"最近接这个月第15天的工作日",如果第15天是周六,那么会在第14天即周五触发
  8. # 只能在’周’上使用,用来指定这个月的第几个周几,如’6#3’表示这个月的第三个周五(6表示周五,3表示第三周).如果指定日期不存在,那么将不会触发
  9. C指和canlendar联系后计算过的值,如在’天’上标注’5C’指这个月第五天或之后包括canlendar的第一天;在’周’上标’1C’指这周日或之后包括calendar的第一天.

当然不理解也没关系,网上一搜就有很多Cron表达式在线生成器

实现定时任务

背景

使用异步进行文件上传,将获取token文件存到数据库中,如果用户在提交表单之前反复上传文件会产生很多僵尸数据,需要使用定时任务删除僵尸token字段和上传到服务器的图片

实现

开启任务调度

@EnableScheduling //开启任务调度
@SpringBootApplication
public class UploadApplication {
    public static void main(String[] args) {
        SpringApplication.run(UploadApplication.class, args);
    }
}

编写清除僵尸token业务

//mapper
//获取僵尸token的id
List<Integer> selectDeadTokens();
//清除僵尸数据
int deleteDeadToken(@Param("ids") List<Integer> ids);
<delete id="deleteDeadToken">
       delete from imagetoken where id in
       <foreach collection="ids" item="e" open="(" separator="," close=")">
           #{e}
       </foreach>
</delete>
<select id="selectDeadTokens" resultType="java.lang.Integer">
        SELECT id FROM imagetoken t
        WHERE t.token NOT IN (select token FROM good)
</select>
//service 
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.SERIALIZABLE)
    @Override
    public void deleteDeadToken() {
        System.out.println("---开始清除所有僵尸token---");
        List<Integer> list = imagetokenMapper.selectDeadTokens();
        System.out.println("已找到"+list.size()+"条数据");
        if (list.size()>0) {
            int result = imagetokenMapper.deleteDeadToken(list);
            System.out.println("本次删除"+result+"条数据");
        }
    }

查找数据库中存放文件地址的集合

 @Override
    public List<String> getList() {
        //条件构造器 查存放地址
        LambdaQueryWrapper<Good> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(Good::getSavepath);
        //this指的是当前service
        List<Good> list = this.list(queryWrapper);
//        System.out.println("查询到的数据:");
//        System.out.println(list);
        //获取数据库中所有图片的绝对路径List<String>
        ArrayList<String> paths = new ArrayList<>();
        //将查到的数据中的文件地址遍历到String类型的list中
        list.stream().forEach(good -> {
            paths.add(good.getSavepath());
        });
        //System.out.println("查到的路径:"+paths);
        return  paths;
    }

使用@Scheduled注解开启任务调度

@Value("${image.savepath}")
    String savePath;
    /**
     * 每天晚上23点清除无效token数据并删除图片
     */
    @Scheduled(cron = "0 0 23 * * ?")
    public void delete(){
        //1.清除无效token
        imagetokenService.deleteDeadToken();
        //2.删除僵尸文件
        //2.1获取数据库中文件存储列表
        List<String> paths = goodService.getList();
        //2.2 获取图片存储地址
        File target=new File(savePath);
        //2.3遍历图片存储所在文件夹的文件
        File[] files=target.listFiles();
        for (File file : files) {
            if (file.isFile()){
                //2.4获取存储文件的绝对地址,需要将盘符修改,
                String absPath = file.getAbsolutePath().replaceAll("\\\\", "/");
                //2.5将不存在的文件删除
                if(!paths.contains(absPath)){
                     //System.out.println("要删除文件的觉得路径:"+absPath);
                     file.delete();
                 }
            }
        }
    }

到此这篇关于Spring Task定时任务的实现详解的文章就介绍到这了,更多相关Spring定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot整合mybatis-plus代码生成器的配置解析

    springboot整合mybatis-plus代码生成器的配置解析

    这篇文章主要介绍了springboot整合mybatis-plus代码生成器的配置解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • idea中如何创建scala项目

    idea中如何创建scala项目

    idea中创建scala项目有三种方式1.通过maven;2.通过idea;3.通过sbt的方式;本文就每种方法通过图文并茂的形式给大家详细介绍,需要的朋友参考下吧
    2021-07-07
  • Java中两种基本的输入方式小结

    Java中两种基本的输入方式小结

    这篇文章主要介绍了Java中两种基本的输入方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java实现发红包功能

    Java实现发红包功能

    这篇文章主要为大家详细介绍了Java实现发红包功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • mybatis源码解读之executor包语句处理功能

    mybatis源码解读之executor包语句处理功能

    这篇文章主要介绍了executor包语句处理功能,mybatis中支持三种语句类型,不同语句类型支持的变量符号不同,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • java 中复合机制的实例详解

    java 中复合机制的实例详解

    这篇文章主要介绍了java 中复合机制的实例详解的相关资料,希望通过本文大家能了解继承和复合的区别并应用复合这种机制,需要的朋友可以参考下
    2017-09-09
  • Java全面讲解顺序表与链表的使用

    Java全面讲解顺序表与链表的使用

    大家好,今天给大家带来的是顺序表和链表,我觉得顺序表还是有比较难理解的地方的,于是我就把这一块的内容全部整理到了一起,希望能够给刚刚进行学习数据结构的人带来一些帮助,或者是已经学过这块的朋友们带来更深的理解,我们现在就开始吧
    2022-05-05
  • java 发送带Basic Auth认证的http post请求实例代码

    java 发送带Basic Auth认证的http post请求实例代码

    下面小编就为大家带来一篇java 发送带Basic Auth认证的http post请求实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java中Map的九种遍历方式总结

    Java中Map的九种遍历方式总结

    日常工作中 Map 绝对是我们 Java 程序员高频使用的一种数据结构,那 Map 都有哪些遍历方式呢?这篇文章就带大家看一下,看看你经常使用的是哪一种
    2022-11-11
  • Java中的移位运算符使用及原理详解

    Java中的移位运算符使用及原理详解

    在 Java 中,移位运算符用于对二进制数进行位移操作,它们可以将一个数的所有位向左或向右移动指定的位数,本文小编将给大家详细的介绍一下Java移位运算符,需要的朋友可以参考下
    2023-09-09

最新评论