目录

java后端-定时任务

java后端–定时任务

一、简述

在java后端开发中,经常遇到一些任务需要频繁发生,每次都人工调用太麻烦,这时就用到了定时任务进行自动化调用,大大便利了程序员的开发工作并可以实现某种场景下的一些功能。

二、注解

1.@Scheduled

是Spring框架中的,可以讲一个方法标记为定时任务,被标注的方法必须是无返回值类型(void),且方法不能有参数。

属性:

①fixedRate:时间间隔,单位为毫秒。无论任务执行时长如何,下一次任务都会在上一次任务开始后的指定时间间隔后启动。

②fixedDelay:任务完成后,下一次任务开始前的延迟时间,单位为毫秒。

③initialDelay:指定任务首次执行前的延迟时间,单位为毫秒。

④cron:使用Cron表达式指定任务的执行时间

由6或7个时间字段构成,空格分隔

秒 分 时 日 月 周 【年】

*:表示所有值,例如在“分” 位置用 ,表示每分钟都执行

?:表示不指定值,只能在 “日” “月” 字段

-:表示范围,10-12表示在十点到十二点

,:表示与的关系,“1,2,3”表示这三个时间点都执行

/:表示间隔时间,例如0/15在 “分” 位置表示从0开始,每隔十五分钟执行一次

例子:

0 30 9 * * MON-FRI:周一至周五的上午 9:30 执行。

0 0 12 1/5 * ?:每月的第 1 天开始,每 5 天的中午 12 点执行。

2.@EnableScheduling

属于Spring框架,用于启动Spring的定时任务功能。只能在配置类上使用,自动扫描带有@Scheduled注解的方法,注册为定时任务

一般用在Application.java 启动类上

三、案例

@Component
public class ScheduledTasks {

    // 每隔 5 秒执行一次
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("Fixed rate task executed at " + System.currentTimeMillis());
    }

    // 任务执行完成后,延迟 3 秒再执行下一次
    @Scheduled(fixedDelay = 3000)
    public void fixedDelayTask() {
        System.out.println("Fixed delay task executed at " + System.currentTimeMillis());
    }

    // 首次延迟 2 秒后开始执行,之后每隔 4 秒执行一次
    @Scheduled(initialDelay = 2000, fixedRate = 4000)
    public void initialDelayTask() {
        System.out.println("Initial delay task executed at " + System.currentTimeMillis());
    }

    // 每天凌晨 2 点执行
    @Scheduled(cron = "0 0 2 * * ?")
    public void cronTask() {
        System.out.println("Cron task executed at " + System.currentTimeMillis());
    }
}

特定场景下:

如果用户的注册到期了,五分钟后给他自动禁用

@Slf4j
@Component
public class UserDisable {
    @Resource
    private UserMapper userMapper;

    @Resource
    private UserService userService;

    @Scheduled(cron = "0 0 7 * * ?")   //每日七点执行一次
    public void disableUsers(){
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DAY_OF_YEAR, 0);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, -5);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            Date sDaysAgo = calendar.getTime();
            //查询有哪些用户到期
            List<Long> idList = userMapper.selectByEndTime(sDaysAgo);
            //禁用操作
            for (Long id : idList) {
                userService.disabled(id);
            }
        }catch (Exception e){
            e.getMessage();
        }
    }
}

别忘了在启动类上加@EnableScheduling进行启用定时任务