1. 程式人生 > >利用Apache PropertiesConfiguration實現spring 定時任務配置的及時重新整理

利用Apache PropertiesConfiguration實現spring 定時任務配置的及時重新整理


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個前提下:

  1. 觸發配置更新的時間是定時任務的下次執行時
  2. PropertiesConfiguration的資料已經更新

針對以上情況,舉個例子,當你上午10:25在配置檔案中將定時任務配置從整點執行1次修改為每30分鐘執行1次,你並不能期望他在10:30執行,此配置的修改只會在11:00執行時生效,而且生效的前提是配置項已經更新到config變數中。