Spring Task定时任务的实现详解

目录
  • Spring Task定时任务
    • Cron表达式
    • 实现定时任务
      • 背景
      • 实现

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定时任务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring整合TimerTask实现定时任务调度

    一. 前言 最近在公司的项目中用到了定时任务, 本篇博文将会对TimerTask定时任务进行总结, 其实TimerTask在实际项目中用的不多, 因为它不能在指定时间运行, 只能让程序按照某一个频度运行. 二. TimerTask JDK中Timer是一个定时器类, 它可以为指定的定时任务进行配置. JDK中TimerTask是一个定时任务类, 该类实现了Runnable接口, 是一个抽象类, 我们可以继承这个类, 实现定时任务. /** * 继承TimerTask实现定时任务 */ publi

  • mall整合SpringTask实现定时任务的方法示例

    摘要 本文主要讲解mall整合SpringTask的过程,以批量修改超时订单为例.SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用.Cron表达式是一个字符串,包括6~7个时间元素,在SpringTask中可以用于指定任务的执行时间. 项目使用框架介绍 SpringTask SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用. Cron表达式 Cr

  • spring task 定时任务实现示例

    一.引入spring相关jar包: 二.在web.xml中配置spring <listener> <description>Spring监听器</description> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-na

  • 使用spring-task定时任务动态配置修改执行时间

    目录 spring-task定时任务动态配置修改执行时间 spring schedule 动态配置执行时间 spring-task定时任务动态配置修改执行时间 因项目需要,几个定时任务需要人为动态设置执行时间,于是乎吧,就查阅相关资料,是可以动态设置的,废话不多说,直接上代码,一目了然. package com.seckill.quartz; import org.springframework.scheduling.Trigger; import org.springframework.sch

  • Spring Task定时任务每天零点执行一次的操作

    最近根据项目的需求,需要限制用户每天的发送短信数量.这样以来就需要写一个定时任务,每天去置零一次所有用户的发送短信统计数量. 首先,在application.xml文件中添加 <task:annotation-driven /> 接着就是编写自己的业务处理逻辑 package com.*.*.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.sch

  • Spring Task定时任务的配置和使用详解

    记录下Spring自带的定时任务用法. spring中使用定时任务 基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/

  • java 中Spring task定时任务的深入理解

    java 中Spring task定时任务的深入理解 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象.这就意味着spring容许你使用其他的定时任务框架,当然spring自身也提供了一种定时任务的实现:spring task.spring task支持线程池,可以高效处理许多不同的定时任务.同时,spring还支持使用Java自带的Timer定时器和Quartz定时框架.

  • SpringBoot整合SpringTask实现定时任务

    半藏商城中会有一些用户提交了订单但是一直没有支付的情况,之前我是通过quartz定时任务每天的5点扫描未支付订单然后读取用户的邮箱地址发送邮件提醒用户尽快支付.这次我是采用Spring中自带的SpringTask来进行定时任务. Cron表达式 Cron表达式是一个字符串,包括6~7个时间元素,在SpringTask中可以用于指定任务的执行时间. Cron的语法格式 Seconds Minutes Hours DayofMonth Month DayofWeek Cron格式中每个时间元素的说明

  • Spring Task定时任务的实现详解

    目录 Spring Task定时任务 Cron表达式 实现定时任务 背景 实现 Spring Task定时任务 Cron表达式 以6-7位的一组数字,中间用空格间隔的字符串,表达一种时间 每位的含义及取值范围: 秒(0-59) 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(1-7或SUN-SAT) 年(四位数,可省略) 符号的含义: *表示所有值(秒位是*,则表示每秒) ?表示未说明的值,(日和周必须有一位为?,因为不合逻辑) -表示一个指定的范围 ,表示一个可能值 /符号

  • SpringBoot设置动态定时任务的方法详解

    之前写过文章记录怎么在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活. 经过网上搜索学习后,特此记录如何在SpringBoot项目中实现动态定时任务. 因为只是一个demo,所以只引入了需要的依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <ar

  • Java实现定时任务的方法详解

    目录 前言 定时任务是什么 定时任务的有哪些是实现方式 纯手写单线程循环 Timer 和它的小伙伴 ScheduledExecutorService Spring 提供的定时任务 总结 前言 学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说: 你写一个定时任务就好了. 写个定时任务让他去爬取就行了. 我不会,所以现在得补回来了,欠下的终究要还的,/(ㄒoㄒ)/~~ 定时任务是什么 大家都用过闹钟,闹钟可以说是一种定时任务. 比如我们设定了周一到周五早上7点半的时间响铃,那么闹钟就会在周

  • spring整合Quartz框架过程详解

    这篇文章主要介绍了spring整合Quartz框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.Quartz框架简介 Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性.主要用来执行定时任务,如:定时发送信息.定时生成报表等等. Quartz框架的主要特点: · 强大的调度功能,例如丰富多样的

  • spring Retryable注解实现重试详解

    spring-boot:1.5.3.RELEASE,spring-retry-1.2.0.RELEASE 使用方法 引入pom // 版本号继承spring-boot依赖管理的pom <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency>

  • Java Spring之@Async原理案例详解

    目录 前言 一.如何使用@Async 二.源码解读 总结 前言 用过Spring的人多多少少也都用过@Async注解,至于作用嘛,看注解名,大概能猜出来,就是在方法执行的时候进行异步执行. 一.如何使用@Async 使用@Async注解主要分两步: 1.在配置类上添加@EnableAsync注解 @ComponentScan(value = "com.wang") @Configuration @EnableAsync public class AppConfig { } 2.在想要异

  • Spring的事件机制知识点详解及实例分析

    同步事件和异步事件 同步事件: 在一个线程里,按顺序执行业务,做完一件事再去做下一件事. 异步事件: 在一个线程里,做一个事的同事,可以另起一个新的线程执行另一件事,这样两件事可以同时执行. 用一个例子来解释同步事件和异步事件的使用场景,有时候一段完整的代码逻辑,可能分为几部分,拿最常见的注册来说,假设完整流程是,1.点击注册->2.检验信息并存库->3.发送邮件通知->4.返回给用户.代码这么写是正确,但不是最好的,缺点如下: 逻辑复杂,业务耦合,我们把校验数据并存库和发送邮件写到一个

  • Spring AOP的实现原理详解及实例

    Spring AOP的实现原理详解及实例 spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的. 以下是JDK动态代理和CGLIB代理简单介绍 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理. CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类.CGLIB是高效的代码生成包,底层是依靠ASM(开源的Java字节码编辑类库)操作字节码实现的,性能比JDK强. 在Spring中

  • Spring boot 使用mysql实例详解

    Spring boot 使用mysql实例详解 开发阶段用 H2即可,上线时,通过以下配置切换到mysql,spring boot将使用这个配置覆盖默认的H2. 1.建立数据库: mysql -u root CREATE DATABASE springbootdb 2.pom.xml: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId&g

随机推荐