使用Scheduled注解实现定时任务

本文介绍了如何使用Spring框架的Scheduled注解创建定时任务,并详细解释了cron表达式的构成和使用方法,以实现自动清理旧数据功能。cron表达式决定任务的执行频率,且cron生效需重启服务器,不宜动态修改。
摘要由CSDN通过智能技术生成

使用Scheduled注解实现定时任务

1.创建定时器
@Component
@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class SaticScheduleTask {
    //3.添加定时任务,每30秒执行一次(使用@Scheduled注解)
    @Scheduled(cron = "0/30 * * * * ?")
    private void configureTasks() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String strDate =dateFormat.format(new Date());
        System.err.println("执行静态定时任务时间: " + strDate);
    }
}

2.了解cron表达式

一个cron表达式可以有6个元素或者7个元素组成(“年”这个元素可以省略,省略之后就是默认“每一年”)

例如上述例子中 ”0/30 * * * * ?”

2.1从左到右的参数分别是
  • 秒(0~59) 例如0/5表示每5秒
  • 分(0~59)
  • 时(0~23)
  • 日(0~31)的某天,需计算
  • 月(0~11)
  • 周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT,其中周日SUM是1)
  • 年(1970-2099)
2.2两个常用的符号
  • “/”字符用来指定数值的增量
    例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
    在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
  • “?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
    当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
2.3常见的案例
  • ”0 0 10,14,16 * * ?” 每天上午10点,下午2点,4点

  • “0 0/45 9-17 * * ?” 朝九晚五工作时间内每45分钟

  • “0 0 12 ? * WED” 表示每个星期三中午12点

  • “0 0 12 * * ?” 每天中午12点触发

  • “0 15 10 ? * *” 每天上午10:15触发(这个和下一个案例说明,必须"月份中的日期"和"星期"中有一个设置为“?”)

  • “0 15 10 * * ?” 每天上午10:15触发

3.具体案例

现在需要让用户输入一个时间参数{time}

自动让{time}天以内没有进行更新的数据自动删除

解题思路:每天凌晨0点更新,获取当前时间减去30天的时间 thirtyDaysAgo。将数据库中最后一次更新时间晚于 thirtyDaysAgo的数据删除掉即可。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class DataCleanupTask {
    
    @Autowired
    private YourDataService yourDataService; // 替换为你的数据服务类

    @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行一次
    public void cleanupOldData() {
        // 获取当前时间减去30天的时间
        LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30);
        
        // 调用数据服务类的方法,查询需要删除的数据
        List<YourData> dataToDelete = yourDataService.findDataOlderThan(thirtyDaysAgo);
        
        // 删除查询到的数据
        for (YourData data : dataToDelete) {
            yourDataService.deleteData(data.getId());
        }
    }
}

因为cron表达式生效需要重启服务器,所以不建议动态修改cron表达式

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值