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进行启用定时任务