利用Apache PropertiesConfiguration實現spring 定時任務配置的及時重新整理
阿新 • • 發佈:2018-11-09
import java.util.Date; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; /** * 定時任務類 * * @author 00fly * @version [版本號, 2017年4月25日] * @see [相關類/方法] * @since [產品/模組版本] */ @Component public class MyScheduleJob { Logger logger = LoggerFactory.getLogger(getClass()); /** * 定時任務cron配置檔案 */ PropertiesConfiguration config; /** * <預設建構函式> */ public MyScheduleJob() { super(); try { config = new PropertiesConfiguration("demo.properties"); FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy(); strategy.setRefreshDelay(60000L);// 重新整理週期1分鐘 config.setReloadingStrategy(strategy); } catch (ConfigurationException e) { logger.error(e.getMessage(), e.getCause()); } } /** * 定時任務1 * * @see [類、類#方法、類#成員] */ @Component class MyTask implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(new Runnable() { @Override public void run() { // 任務邏輯 logger.info("------ MyTask run -------"); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { // 任務觸發,可修改任務的執行週期 String cron = config.getString("schedule.myjob.cron"); return new CronTrigger(cron).nextExecutionTime(triggerContext); } }); } } }
注意:此實現方式雖然簡單,但定時任務配置的重新整理建立在以下2個前提下:
- 觸發配置更新的時間是定時任務的下次執行時
- PropertiesConfiguration的資料已經更新
針對以上情況,舉個例子,當你上午10:25在配置檔案中將定時任務配置從整點執行1次修改為每30分鐘執行1次,你並不能期望他在10:30執行,此配置的修改只會在11:00執行時生效,而且生效的前提是配置項已經更新到config變數中。