定時任務通常會在不少項目中都會用到,咱們每每會間隔性的的去完成某些特定任務來減小服務器和數據庫的壓力。比較常見的就是金融服務系統推送回調,通常支付系統訂單在沒有收到成功的回調返回內容時會持續性的回調,這種回調通常都是定時任務來完成的。還有就是報表的生成,咱們通常會在客戶訪問量太小的時候來完成這個操做,那每每都是在凌晨。這時咱們也能夠採用定時任務來完成邏輯。SpringBoot爲咱們內置了定時任務,咱們只須要一個註解@Scheduled就能夠開啓定時任務了。web
下面咱們來經過SpringBoot項目熟悉一下具體實現spring
<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
@EntityScan(basePackages= {"cn.sh.sttri.app.messagelistener.*.entity"})
@EnableCaching
@EnableScheduling
public class MessagelistenerApplication {
public static void main(String[] args) {
SpringApplication.run(MessagelistenerApplication.class, args);
}
}
複製代碼
ScheduledTask
用來演示定時任務使用@scheduled註解來演示定時執行任務的方式 咱們經過@scheduled註解用來配置到方法上來完成對應的定時任務的配置,如執行時間,間隔時間,延遲時間等等,下面咱們就來詳細的看下對應的屬性配置。 @Component這個註解能夠在程序啓動時自動將該類加載進來數據庫
該屬性是程序啓動後每3000ms執行一次bash
/**
* Created by zhangshuai on 2018/11/14 .
*/
@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("1第%s次執行,當前時間爲:%s", count1++, dateFormat.format(new Date(System.currentTimeMillis()))));
}
}
複製代碼
執行結果以下 服務器
/**
* 天天中午十二點觸發
*/
@Scheduled(cron="0 0 12 * * ?")
public void cron() {
System.out.println(String.format("1第%s次執行,當前時間爲:%s", count1++, dateFormat.format(new Date(System.currentTimeMillis()))));
}
複製代碼
這是一個時間表達式,能夠經過簡單的配置就能完成各類時間的配置,咱們經過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年app
下面簡單舉幾個例子:spring-boot
"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" 每一個周1、周2、周3、周4、週五的10:15觸發spa
該屬性的含義是上一個調用開始後再次調用的延時(不用等待上一次調用完成),這樣就會存在重複執行的問題,因此不是建議使用,但數據量若是不大時在配置的間隔時間內能夠執行完也是可使用的。.net
@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()))));
}
複製代碼
該屬性的做用是第一次執行延遲時間code
@Scheduled(initialDelay=1000,fixedDelay = 3000)
public void initialDelay() {
System.out.println(String.format("1第%s次執行,當前時間爲:%s", count1++, dateFormat.format(new Date(System.currentTimeMillis()))));
}
複製代碼
**注意:**上面全部屬性的配置時間單位都是毫秒