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裝配依賴對象,重新賦值即可