SpringBoot中使用@Scheduled創建定時任務
定時任務一般會在很多項目中都會用到,我們往往會間隔性的的去完成某些特定任務來減少服務器和數據庫的壓力。比較常見的就是金融服務系統推送回調,一般支付系統訂單在沒有收到成功的回調返回內容時會持續性的回調,這種回調一般都是定時任務來完成的。還有就是報表的生成,我們一般會在客戶訪問量過小的時候來完成這個操作,那往往都是在凌晨。這時我們也可以采用定時任務來完成邏輯。SpringBoot為我們內置了定時任務,我們只需要一個注解@Scheduled就可以開啟定時任務了。
一,在pom.xml文件中加入依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
二,創建啟動類上添加注解@SpringBootApplication
和@EnableScheduling
@SpringBootApplication
@EnableCaching
@EnableScheduling
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
}
三,創建類ScheduledTask
用來演示定時任務
使用@scheduled注解來演示定時執行任務的方式
我們通過@scheduled注解用來配置到方法上來完成對應的定時任務的配置,如執行時間,間隔時間,延遲時間等等,下面我們就來詳細的看下對應的屬性配置。
@Component這個注解可以在程序啟動時自動將該類加載進來
fixedDelay屬性
該屬性是程序啟動后每3000ms執行一次
@Component
public class ScheduledTask {
@Autowired
public QuartzJobService quartzJobService;
private static int count1=1;
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled(fixedDelay = 3000)
public void fixedDelay() {
System.out.println(String.format("第%s次執行,當前時間為:%s", count1++, dateFormat.format(new Date(System.currentTimeMillis()))));
}
}
cron屬性
這是一個時間表達式,可以通過簡單的配置就能完成各種時間的配置,我們通過CRON表達式幾乎可以完成任意的時間搭配,它包含了六或七個域:
Seconds : 可出現", - * /"四個字符,有效范圍為0-59的整數
Minutes : 可出現", - * /"四個字符,有效范圍為0-59的整數
Hours : 可出現", - * /"四個字符,有效范圍為0-23的整數
DayofMonth : 可出現", - * / ? L W C"八個字符,有效范圍為0-31的整數
Month : 可出現", - * /"四個字符,有效范圍為1-12的整數或JAN-DEc
DayofWeek : 可出現", - * / ? L C #"四個字符,有效范圍為1-7的整數或SUN-SAT兩個范圍。1表示星期天,2表示星期一, 依次類推
Year : 可出現", - * /"四個字符,有效范圍為1970-2099年
推薦一個在線Cron表達式生成器http://cron.qqe2.com/
幾個簡單例子
"0 0 12 * * ?" 每天中午十二點觸發
"0 15 10 ? * *" 每天早上10:15觸發
"0 15 10 * * ?" 每天早上10:15觸發
"0 15 10 * * ? *" 每天早上10:15觸發
"0 15 10 * * ? 2005" 2005年的每天早上10:15觸發
"0 * 14 * * ?" 每天從下午2點開始到2點59分每分鍾一次觸發
"0 0/5 14 * * ?" 每天從下午2點開始到2:55分結束每5分鍾一次觸發
"0 0/5 14,18 * * ?" 每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鍾一次觸發
"0 0-5 14 * * ?" 每天14:00至14:05每分鍾一次觸發
"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44觸發
"0 15 10 ? * MON-FRI" 每個周一、周二、周三、周四、周五的10:15觸發
fixedRate屬性
該屬性的含義是上一個調用開始后再次調用的延時(不用等待上一次調用完成),這樣就會存在重復執行的問題,所以不是建議使用,但數據量如果不大時在配置的間隔時間內可以執行完也是可以使用的。
@Scheduled(fixedRate = 1000)
public void fixedRate() throws InterruptedException {
Thread.sleep(2000);
System.out.println(String.format("1第%s次執行,當前時間為:%s", count1++, dateFormat.format(new Date(System.currentTimeMillis()))));
}
initialDelay屬性
該屬性的作用是第一次執行延遲時間
@Scheduled(initialDelay=1000,fixedDelay = 3000)
public void initialDelay() {
System.out.println(String.format("1第%s次執行,當前時間為:%s", count1++, dateFormat.format(new Date(System.currentTimeMillis()))));
}
注意:上面所有屬性的配置時間單位都是毫秒