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

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

一. 启动类中添加开启定时器注解@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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值