基於註解實現一個簡單的定時任務(靜態定時任務)
“/”:爲特別單位,表示爲“每”如“0/15”表示每隔15分鐘執行一次,“0”表示爲從“0”分開始, “3/20”
表示每隔20分鐘執行一次,“3”表示從第3分鐘開始執行
“?”:表示每月的某一天,或第周的某一天
“L”:用於每月,或每週,表示爲每月的最後一天,或每個月的最後星期幾
如“6L”表示“每月的最後一星期五”
“W”:表示爲最近工作日,如“15W”放在每月(day-of-month)字段上表示爲“到本月15日最近的工日”
““#”:是用來指定“的”每月第n個工作日,例 在每週(day-of-week)這個字段中內容爲"6#3" or //"FRI#3" 則表示“每月第三個星期五”
@Component
@Configurable
@EnableScheduling
public class StoreServiceImpl implements StoreService{
//Cron表達式範例:
//每隔5秒執行一次:*/5 * * * * ?
//每隔1分鐘執行一次:0 */1 * * * ?
//每天23點執行一次:0 0 23 * * ?
//每天凌晨1點執行一次:0 0 1 * * ?
//每月1號凌晨1點執行一次:0 0 1 1 * ?
//每月最後一天23點執行一次:0 0 23 L * ?
//每週星期天凌晨1點實行一次:0 0 1 ? * L
@Scheduled(cron = "0 0 0 * * ?")
public void changeRecommendSatus() {
//執行自己的代碼
}
}
手動開啓和關閉一個定時任務
相關類和方法簡介
ThreadPoolTaskScheduler:線程池任務調度類,能夠開啓線程池進行任務調度。
ThreadPoolTaskScheduler.schedule() :
方法會創建一個定時計劃ScheduledFuture,需要兩個參數
Runnable(線程接口類) 和CronTrigger(定時任務觸發器)
ScheduledFuture(定時計劃類),中有一個cancel可以停止定時任務。
//實例化一個線程池任務調度類
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
//接收生成的定時計劃
private ScheduledFuture<?> future;
//這裏做一個實現多線程的類,裏面的run方法會被 ScheduledFuture對象定時觸發,時間
是你填寫的cron表達式
public class MyRunnable implements Runnable {
public void run() {
System.out.println("DynamicTask.MyRunnable.run()," + new Date());
//這裏寫你想要執行的代碼
}
}
// 定時計劃類提供方法能結束當前的定時任務
public String stopCron() {
if (future != null) {
future.cancel(true);
}
System.out.println("DynamicTask.stopCron()");
return "stopCron";
}
//生成一個定時計劃類,傳入的線程會被定時執行
public String startCron() {
//cron是你定義的表達式
if(cron != null) {
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger(cron));
System.out.println("DynamicTask.startCron()");
return "startCron";
}else {
return "faild";
}
}