利用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变量中。

完整的项目代码参考: effict-side: 效率开发工具汇总,持续更新优化 - Gitee.com

你可能感兴趣的:(Java,雕虫小技,apache,spring,java)