Spring Boot 教程:調(diào)度
【注】本文譯自: https://www.tutorialspoint.com/spring_boot/spring_boot_scheduling.htm

? ? 調(diào)度用來處理特定時(shí)間周期的任務(wù)。Spring Boot 為 Spring 應(yīng)用編寫調(diào)度器提供了良好的支持。
Java Cron 表達(dá)式
? ?Java Cron 表達(dá)式用于配置 CronTrigger 實(shí)例,是 org.quartz.Trigger 的子類。關(guān)于 Java cron 表達(dá)式的更多信息可參考:https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm
? ?@EnableScheduling 注解用于使你的應(yīng)用能夠使用調(diào)度器。這個(gè)注解應(yīng)當(dāng)被加在主 Spring Boot 應(yīng)用類文件中。
@SpringBootApplication
@EnableScheduling
public?class?DemoApplication?{
???public?static?void?main(String[]?args)?{
??????SpringApplication.run(DemoApplication.class,?args);
???}
}
? ?@Scheduled 注解用于觸發(fā)一個(gè)特定時(shí)間周期的調(diào)度器。
@Scheduled(cron?=?"0?*?9?*?*??")
public?void?cronJobSch()?throws?Exception?{
}
? ?以下代碼展示了如何在每天的早上 9:00 到 9:59 之間每分鐘執(zhí)行任務(wù):
package?com.tutorialspoint.demo.scheduler;
import?java.text.SimpleDateFormat;
import?java.util.Date;
import?org.springframework.scheduling.annotation.Scheduled;
import?org.springframework.stereotype.Component;
@Component
public?class?Scheduler?{
???@Scheduled(cron?=?"0?*?9?*?*??")
???public?void?cronJobSch()?{
??????SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss.SSS");
??????Date?now?=?new?Date();
??????String?strDate?=?sdf.format(now);
??????System.out.println("Java?cron?job?expression::?"?+?strDate);
???}
}
? ?以下截圖展示了應(yīng)用在?09:03:23?啟動(dòng)之后如何每隔一分鐘執(zhí)行一次:

固定頻度
? ?固定頻度調(diào)度器被用于在特定時(shí)間執(zhí)行任務(wù)。它不等待前一個(gè)任務(wù)完成,時(shí)間單位為毫秒。示例代碼如下:
@Scheduled(fixedRate?=?1000)
public?void?fixedRateSch()?{?
}
? ?以下代碼示例是應(yīng)用啟動(dòng)后的每秒鐘執(zhí)行一個(gè)任務(wù):
package?com.tutorialspoint.demo.scheduler;
import?java.text.SimpleDateFormat;
import?java.util.Date;
import?org.springframework.scheduling.annotation.Scheduled;
import?org.springframework.stereotype.Component;
@Component
public?class?Scheduler?{
???@Scheduled(fixedRate?=?1000)
???public?void?fixedRateSch()?{
??????SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss.SSS");
??????Date?now?=?new?Date();
??????String?strDate?=?sdf.format(now);
??????System.out.println("Fixed?Rate?scheduler::?"?+?strDate);
???}
}
? ?觀看以下截屏,可以看出應(yīng)用在?09:12:00 啟動(dòng)后以每隔一秒鐘的固定頻度執(zhí)行任務(wù)。

固定延遲
? ?固定延遲調(diào)度器用于在指定時(shí)間執(zhí)行任務(wù)。它應(yīng)當(dāng)?shù)却弦粋€(gè)任務(wù)完成,單位為毫秒。示例代碼如下:
@Scheduled(fixedDelay?=?1000,?initialDelay?=?1000)
public?void?fixedDelaySch()?{
}
? ?這里,initialDelay 是在初始化之后到首次執(zhí)行間的延遲值。
? ?下面的例子中,是從應(yīng)用啟動(dòng)完成后 3 秒后執(zhí)行每秒一次的任務(wù):
package?com.tutorialspoint.demo.scheduler;
import?java.text.SimpleDateFormat;
import?java.util.Date;
import?org.springframework.scheduling.annotation.Scheduled;
import?org.springframework.stereotype.Component;
@Component
public?class?Scheduler?{
???@Scheduled(fixedDelay?=?1000,?initialDelay?=?3000)
???public?void?fixedDelaySch()?{
??????SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss.SSS");
??????Date?now?=?new?Date();
??????String?strDate?=?sdf.format(now);
??????System.out.println("Fixed?Delay?scheduler::?"?+?strDate);
???}
}
? ?下面看到的截屏顯示的是應(yīng)用在?09:18:39 啟動(dòng)完成 3 秒后,固定延遲調(diào)度器任務(wù)每秒執(zhí)行一次的情況。
