Spring Boot 集成Schedule

  • 集成Schedule

    • SpringBoot Schedule 實現原理

      • 通過 JUC 的 ScheduledThreadPoolExecutor 實現 Spring Boot 的 Schedule
      • Quartz 也是通過 ScheduledThreadPoolExecutor 來實現定時任務的執行與調度
    • SpringBoot 使用 @Scheduled創建 定時任務SpringBoot Runner的應用

      // ApplicationRunner (應用程序運行器) 是一個用於在Spring Boot應用程序啓動後執行代碼的接口
      // CommandLineRunner (控制檯窗口運行器) 是一個接口
      @SpringBootApplication
      @EnableScheduling
      public class DemoApplication implements ApplicationRunner {
          public static void main(String[] args) {
              SpringApplication.run(DemoApplication.class, args);
          }
      
          @Override
          public void run(ApplicationArguments args) throws Exception {
              System.out.println("Hello World from Application Runner");
          }
      }
      
      /*
      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年
      
      "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觸發
      */  
      
      @Component
      public class ScheduledTasks {
          private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
      
          @Scheduled(fixedRate = 5000)
          public void reportCurrentTime() {
              System.out.println("現在時間:" + dateFormat.format(new Date()));
          }
      
          @Scheduled(cron = "0 */1 * * * ?") // 每1分鐘觸發一次
          @Transactional(rollbackFor = Exception.class)
          public void doWaterExecute() {
            // ...
          }
      
          //月 當月最後一天23:59:55結算
          @Scheduled(cron = "55 59 23 28-31 * ?")
          @Transactional(rollbackFor = Exception.class)
          @Async
          public void doStarMonthHitRankTask() { 
              Date now = new Date();
              boolean dayOfMonth = DateUtils.isLastDayOfMonth(now);
              if (dayOfMonth) {
                // ...
              }
          }
      }
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章