Spring的@Scheduled 动态更新cron表达式
在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
以满足你的具体需求。
评论已关闭