Spring的@Scheduled 动态更新cron表达式
warning:
这篇文章距离上次修改已过418天,其中的内容可能已经有所变动。
在Spring中,你可以使用@Scheduled注解来设置一个定时任务,并使用cron表达式来指定任务的执行计划。如果你需要动态更新这个cron表达式,你可以使用ScheduledTaskRegistrar来实现。
以下是一个简单的例子,展示如何在运行时更新@Scheduled注解使用的cron表达式:
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 java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@Configuration
@EnableScheduling
public class DynamicScheduleConfig implements SchedulingConfigurer {
private String cronExpression = "0 * * * * *"; // 初始cron表达式
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskRegistrar.addTriggerTask(
// 定义执行任务内容
() -> System.out.println("执行动态定时任务: " + System.currentTimeMillis() / 1000),
// 定义执行计划,使用setCronExpression方法来动态更新cron表达式
triggerContext -> new CronTrigger(cronExpression).nextExecutionTime(triggerContext)
);
}
// 使用线程池执行定时任务
private Executor taskExecutor() {
return Executors.newScheduledThreadPool(5);
}
}在这个例子中,DynamicScheduleConfig类实现了SchedulingConfigurer接口,并重写了configureTasks方法。你可以通过调用setCronExpression方法来更新cronExpression字段,这会导致定时任务使用新的计划执行。
请注意,这个例子中的定时任务只是简单地打印当前的时间戳。在实际应用中,你需要替换执行任务内容以及如何获取和设置cronExpression以满足你的具体需求。
评论已关闭