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