SpringBoot 定時任務@Scheduled及SchedulingConfigurer


SpringBoot 定時任務@Scheduled及SchedulingConfigurer

版權聲明:本文為博主原創文章,轉載請附名地址https://www.cnblogs.com/slei212/p/10732260.html

注:Spring 中,創建定時任務除了使用@Scheduled 注解外,還可以使用 SchedulingConfigurer。

@Schedule 注解有一個缺點,其定時的時間不能動態的改變,而基於 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以實現在@Configuration 類上,同時不要忘了,還需要@EnableScheduling 注解的支持。

1.基於注解實現方式

@Component
@EnableScheduling   //開啟定時任務
@EnableAsync   //開啟多線程
public class TimerJob {
	
	private Logger log = Logger.getLogger(TimerJob.class);

        @Async //異步方法;這些方法將在執行的時候,將會在獨立的線程中被執行,調用        者無需等待它的完成,即可繼續其他的操作。
       @Scheduled(cron = "* 0/30 * * * ?")  //時間規則
	public  void matterTasks() {
            //業務邏輯
    }
	
}            

  

2.SchedulingConfigurer實現方式

2.1、在啟動類必須加上@EnableScheduling   //開啟定時任務

2.2、實現SchedulingConfigurer並重寫configureTasks方法

 
        
@Component  //實現SchedulingConfigurer並重寫configureTasks方法
public class OrderJobThread implements SchedulingConfigurer {

	private Logger log = LoggerFactory.getLogger(OrderJobThread.class);
	
	private String cron = "* 0/1 * * * ?"; //調用set方法可動態設置時間規則
	
	public String getCron() {
		return cron;
	}

	public void setCron(String cron) {
		this.cron = cron;
	}

	private String name = "測試"; //調用set方法可以動態設置日志名

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.addCronTask(new Runnable() {
			
			@Override
			public void run() {
				log.warn(name+" --- > 開始");
                                //業務邏輯
                                log.warn(name+" --- > 結束");
			}
		}, cron);  //加入時間
	}
	
	
}
            

  

2.3、設置項目啟動后,初始化 定時任務執行時間

有時希望項目在啟動的時候加載一些系統參數或者方法,就要用到ApplicationRunner

ApplicationRunner是一個接口,我們需要實現它,並重寫run()方法,當項目啟動時,run()方法便會自動執行

@Component
@Order(value = 1)  //value值會 從小至大的執行
public class TimmerStartController implements ApplicationRunner  {

	private static Logger logger = LoggerFactory.getLogger(TimmerStartController.class);

	@Autowired
	private OrderJobThread orderJobThread;  //得到定時任務
	
	@Override
	public void run(ApplicationArguments args) throws Exception {
		logger.info("=========== 項目啟動后,初始化 定時任務執行時間 =============");
		
		orderJobThread.setCron("* 0/5 * * * ?");  //根據需求重新賦值時間規則
		orderJobThread.setName("ordersTasks"); //賦值name
	}

}

  

2.4、如需獲取配置文件里設置的值

2.4.1、

@Component
@PropertySource("classpath:配置文件名")
public class Configration {

	@Value("${配置文件里參數名}")
	private String ordersTasks;

        //set、get方法
}

 

2.4.2、使用@Autowired裝配依賴對象,重新賦值即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM