动态修改定时器的下次执行时间

动态修改定时器的下次执行时间

一. 启动类中添加开启定时器注解@EnableScheduling

@SpringBootApplication
@EnableScheduling
public class AdminServer {
	public static void main(String[] args) {
		SpringApplication.run(AdminServer.class, args);
	}
};

二. 定义定时器service类

@Service
public class SchedulerService implements SchedulingConfigurer {

	private static Logger LOGGER = LoggerFactory.getLogger(DynamicScheduler.class);

    @Bean
    public TaskScheduler poolScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
        scheduler.setPoolSize(1);
        scheduler.initialize();
        return scheduler;
    }

    //我们可以在同一个注册器中执行多个任务,如下所示。
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(poolScheduler());
       //下一个执行时间取自数据库,因此如果数据库中的值更改,下一个执行时间也将更改。
		taskRegistrar.addTriggerTask(() -> scheduledDatabase(5), t -> {  //scheduledDatabase(5) 这个参数时间只是为了测试,可从其他地方获取到参数进行传参
	         Calendar nextExecutionTime = new GregorianCalendar();
	         Date lastActualExecutionTime = t.lastActualExecutionTime();
	         nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
	         nextExecutionTime.add(Calendar.SECOND, 5); //此时间是需要替换的时间,也是下一次定时器执行的时间
	         return nextExecutionTime.getTime();
        });
		//可以有多个任务
		taskRegistrar.addTriggerTask(() -> scheduleFixed(), t -> {
            Calendar nextExecutionTime = new GregorianCalendar();
            Date lastActualExecutionTime = t.lastActualExecutionTime();
            nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
            nextExecutionTime.add(Calendar.SECOND, 7); 
            return nextExecutionTime.getTime();
        });
        //或者cron方式,也可以从DB或其他地方获取表达式,就像我们上面所做的那样。
        CronTrigger croneTrigger = new CronTrigger("0/10 * * * * ?", TimeZone.getDefault());
        taskRegistrar.addTriggerTask(() -> scheduleCron("0/10 * * * * ?"), croneTrigger);
    }

    // 定时执行的方法 (此方法可以定义在任意类中)
    public void scheduledDatabase(int time) {
    	//业务方法
        LOGGER.info("scheduledDatabase: 下次执行时间将从数据库中获取 -> {}", time +"===============>" + new Date());
    }
    
    //我添加这个是为了显示一个任务注册器可以有多个不同的任务。
    public void scheduleFixed() {
        LOGGER.info("scheduleFixed: 下一次执行时间始终为7秒");
    }
    // 此方法获取cron 参数的唯一原因是出于调试目的。
    public void scheduleCron(String cron) {
        LOGGER.info("scheduleCron: 下一次执行此操作的时间取自cron表达式 -> {}", cron);
    }
}
发布了2 篇原创文章 · 获赞 0 · 访问量 34
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览