1. 程式人生 > >Springboot定時任務配置及遇到的問題

Springboot定時任務配置及遇到的問題

SpringBoot定時任務配置及遇到的問題

在springboot中遇到的問題筆記

目錄

註解配置

建立定時任務執行類,配置定時任務註解@Scheduled

springboot可以很方便通過註解配置定時任務,不需要配置檔案

@Component
public class ScheduledTask {

    @Autowired
    private CarDataService carDataService;
    //定時任務註解,表示每30秒執行一次
    @Scheduled(cron = "0/30 * * * * *")
    public
void entranceScheduled() { log.info(">>>>>定時任務開始 時間{}", Timestamp.valueOf(LocalDateTime.now())); //要捕獲異常,不然發生異常後定時任務將不再執行 try { carDataService.carCheckInTask(); } catch (Exception e) { log.info(">>>任務執行失敗 時間{} 錯誤資訊", Timestamp.valueOf(LocalDateTime.now()), e.getMessage()); } log.info(">>>>>時間任務結束 時間{}"
, Timestamp.valueOf(LocalDateTime.now())); } }

講講cron表示式

java中cron表示式是7位,從左到右依次為秒,分,時,日,月,周,年.

  • 星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
  • 逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
  • 中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
  • 正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次。
*    *    *    *    *    *    *
-    -    -    -    -    -    -
|    |    |    |    |    |    |
|    |    |    |    |    |    + year [optional]
|    |    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7)
|    |    |    |    +---------- month (1 - 12)
|    |    |    +--------------- day of month (1 - 31)
|    |    +-------------------- hour (0 - 23)
|    +------------------------- min (0 - 59)
+------------------------------ second (0 - 59)

注意事項

  • 配置定時任務,application一定要加@EnableScheduling註解才能執行
@SpringBootApplication
@EnableScheduling
public class ParkingDataDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ParkingDataDemoApplication.class, args);
    }
}
  • 定時任務預設是單個執行緒執行,若要多執行緒執行需建立ScheduledThreadPoolExecutor執行緒池
@Component
@Configuration
public class ScheduledTask implements SchedulingConfigurer {
    //建立一個定時任務執行緒池

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        //設定一個長度5的定時任務執行緒池
        ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(5);
        scheduledTaskRegistrar.setScheduler(scheduledThreadPoolExecutor);
    }
}
  • 定時任務需要新增try catch

    如果定時任務執行過程中遇到發生異常,則後面的任務將不再執行,會出現定時任務執行一段時間不執行的情況.