背景
@Scheduled 注解的定时任务用起来很方便,但是没办法动态设置时间间隔
实现
- 实现SchedulingConfigurer接口
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.StringUtils;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
@Configuration
@EnableScheduling
public class Scheduled implements SchedulingConfigurer {
/**
* @brief 定时任务名称
*/
private String schedulerName;
/**
* @brief 定时任务周期表达式
*/
private String cron;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setScheduler(Scheduler());
scheduledTaskRegistrar.addTriggerTask(
// 执行定时任务
() -> {
processTask();
},
// 设置触发器
triggerContext -> {
// 初始化定时任务周期
cron = getCron();
if (StringUtils.isEmpty(cron)) {
cron = "0/10 * * * * ?";
}
CronTrigger trigger = new CronTrigger(cron);
return trigger.nextExecutionTime(triggerContext);
});
}
public String getCron(){
// 在这里实现动态获取cron表达式
return null;
}
}