spring boot中的定時任務

Hanyta發表於2024-05-21
  1. SpringBoot中的定時任務主要透過@Scheduled註解以及SchedulingConfigurer介面實現。

  2. @Scheduled註解是Spring提供的一個註解,用於標記方法作為定時任務執行:配置方法在指定的時間間隔或時間點執行,實現各種定時任務需求。

    //在你需要定時的方法上加上@Scheduled註解,並用corn表示式指定如何定時,下式表達了每隔15秒執行一次方法
    @Scheduled(cron = "*/15 * * * * ?")
    public void hello() {
        System.out.println("hello執行了");
    }
    
  3. 但是要記得在啟動類上開啟定時功能:@EnableScheduling // 開啟定時任務功能

  4. @Scheduled任務在單執行緒環境下執行,可能出現任務堆積的情況,尤其在任務量大或任務執行時間長的情況下,而且這些任務可能會變得混亂和難以管理。定時任務的配置分散在各個任務方法中,不利於統一管理和維護。對於需要根據動態條件建立或銷燬定時任務的情況,@Scheduled註解也無法滿足需求。

  5. 使用SchedulingConfigurer介面來動態地建立和管理定時任務。透過實現 SchedulingConfigurer 介面,我們可以編寫程式碼來動態地註冊和管理定時任務,從而實現靈活的任務排程需求。SchedulingConfigurer 介面是 Spring 提供的一個用於定時任務配置的擴充套件介面,它允許開發人員更細粒度地控制定時任務的執行。透過實現SchedulingConfigurer介面,可以自定義任務排程器(TaskScheduler),配置執行緒池等引數,以滿足不同場景下的定時任務需求。

    @Configuration  
    @EnableScheduling  
    public class CustomSchedulingConfig implements SchedulingConfigurer {
    
    	@Override  
    	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    		// 定時任務邏輯
    	}
    }
    
  6. 透過實現SchedulingConfigurer介面,重寫configureTasks方法,自定義任務排程器的配置。此外我們還可以配置執行緒池,用於控制定時任務執行時的執行緒數量、併發性等引數。

    @Bean(destroyMethod = "shutdown")  
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {  
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();  
        scheduler.setPoolSize(5); // 設定執行緒池大小  
        scheduler.setThreadNamePrefix("scheduled-task-"); // 設定執行緒名稱字首  
        scheduler.setAwaitTerminationSeconds(60); // 設定終止等待時間  
    	// 設定處理拒絕執行的任務異常
    	scheduler.setRejectedExecutionHandler((r, executor) -> log.error("Task rejected", r));
    	// 處理定時任務執行過程中丟擲的未捕獲異常
    	scheduler.setErrorHandler(e -> log.error("Error in scheduled task", e));
        return scheduler;  
    }
    //然後將自定義的ThreadPoolTaskScheduler設定到ScheduledTaskRegistrar中去:
    @Override  
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    	// 定時任務邏輯
    	taskRegistrar.setTaskScheduler(threadPoolTaskScheduler());
    }
    //透過SchedulingConfigurer介面,可以更靈活地配置任務排程器和定時任務的執行規則,比如動態註冊定時任務、動態修改任務執行規則等。
    

相關文章