80.使用定时器schedure实现数据过期提醒,并且修改数据对应的状态

例子:周期性的定时任务(例如每周五 23:59:59 例行执行巡视任务)

在某个时间点周期性执行任务,例如每周五 23:59:59 例行执行巡视任务

1.开启定时任务

开启定时任务只需要在 Spring Boot 的启动类上声明 @EnableScheduling 即可,实现代码如下:

@SpringBootApplication

@EnableScheduling // 开启定时任务

public class DemoApplication {

//dothing   

}

2.添加定时任务

定时任务的添加只需要使用 @Scheduled 注解标注即可,如果有多个定时任务可以创建多个 @Scheduled 注解标注的方法,示例代码如下:

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

@Component // 把此类托管给 Spring,不能省略

public class TaskUtils {

    // 添加定时任务

    @Scheduled(cron = "59 59 23 0 0 5") // cron 表达式,每周五 23:59:59 执行

    public void doTask(){

   System.out.println("我是定时任务~");

//1.查询所有需要判断是否过期的数据

//2.遍历数据,时间(使用Date)

For(Order o:orderList){

//Date:new Date()获取当前时间,再使用before与需要判断的业务数据的时间进行比较,判断数据是否过期(也可以使用after)

//LocalDateTime:LocalDateTime.now()获取当前时间,再使用isBefore与需要判断的业务数据的时间进行比较,判断数据是否过期(也可以使用isAfter)

//LocalDate:LocalDate.now()获取当前时间,再使用isBefore与需要判断的业务数据的时间进行比较,判断数据是否过期(也可以使用isAfter)

If(order.getDeadline().before(new Date())){

//3.调用提醒服务接口,新增一条提醒数据

//4.修改数据过期的状态

    }

}

2.cron表达式的用法

1.按顺序依次为

秒 分 时 天 月 周 年 表达式长度为6个或者7个

cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔,其语法格式为:

“秒域 分域 时域 日域 月域 周域 年域”

其中,年域可以省略,省略时表示每年。

1 秒(0~59)
2 分钟(0~59)
3 小时(0~23)
4 天(0~31)
5 月(0~11)
6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)

2.一些符号的意义

(1)* 表示可以匹配该域的所有值;

例如,"0 0 13 * * ?"表示每天的13点执行一次。

(2)?在cron表达式中必须出现且只能出现1次,用在日域或周域上,表示不确定值、不限制值;

它与*的区别是,并不能匹配到该域上的所有值,例如指定了3月份每个周五,那么3月份的周五可能只有4个值;

例如,"0 0 5 6 * ?"表示每个月6日5点钟执行而无论周几,"0 0 5 ? * 3"表示每个周三5点钟执行而无论是几号。

(3)- 表示匹配该域上的一个范围;

例如,"0 30 9-15 ? * *"表示每天的9:30-15:30每小时执行一次,"0 1-5 * ? * 1"表示每周日每个小时的1-5分钟每分钟执行一次。

(4), 表示枚举值;

例如,"0 0 8,16,23 ? * 1,7"表示每个周六日的8点、16点、23点各执行一次。

(5)/ 表示起始时间和间隔时间;

例如,"0 0 3/5 * * ?"表示每天3点开始执行,每隔5个小时执行一次,即3点、8点、13点、18点、23点各执行一次,

"*/5 * * * * ?"表示每隔5秒钟执行一次,"0 */1 * * * ?"表示每隔1分钟执行一次。

(6)# 只能用于周域上,#后面的数字表示第几周,如果不存在这个周的值,则不执行;

例如,"0 0 0 ? * 5#2"表示每个月第2个周四零点执行,"15 30 6 ? * 7#5"表示每个月第5个周六6:30:15执行,如果某个月不存在第5个周六,则不执行。

(7)L 只能用于日域或周域,用于日域时表示当月最后一天,用于周域如果前面不加数字表示周六,加数字表示最后一个周值;

例如,"0 0 23 L * ?"表示每月最后一天的23点执行,"0 0 23 ? * L"表示每周六的23点执行,"0 0 23 ? * 3L"表示每月最后一个周二的23点执行。

3.一些常见实例

3.fixedDelay和fixedRate的使用(以毫秒为单位

1

2

@Scheduled(fixedDelay = 5000) //上一次任务执行完毕时间点之后5秒再执行

@Scheduled(fixedRate = 5000) //上一次任务开始执行时间点之后5秒再执行

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莳光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值