定時任務
- 一、簡述
- 二、注解
- 1.@Scheduled
- 屬性:
- 2.@EnableScheduling
- 三、案例
一、簡述
在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 {@Resourceprivate UserMapper userMapper;@Resourceprivate 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進行啟用定時任務