Spring Boot实用小技巧 - - 第523篇
在Spring Boot中,我们可以使用@Scheduled
注解来创建定时任务。但是,有时我们可能需要动态地启动和停止这些定时任务。以下是一个如何动态启动和停止Spring Boot定时任务的例子:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.concurrent.atomic.AtomicBoolean;
@Configuration
@EnableScheduling
public class DynamicScheduleConfig implements SchedulingConfigurer {
private final AtomicBoolean taskRunning = new AtomicBoolean(false);
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskRegistrar.addTriggerTask(
// 定义执行的任务内容
() -> {
if (taskRunning.get()) {
// 任务执行的逻辑
}
},
// 设定触发的条件
triggerContext -> {
if (taskRunning.get()) {
// 使用Cron表达式设定执行频率
return new CronTrigger("0/5 * * * * ?").nextExecutionTime(triggerContext);
} else {
// 如果任务不运行,返回null
return null;
}
}
);
}
// 开启任务
public void startTask() {
taskRunning.set(true);
}
// 关闭任务
public void stopTask() {
taskRunning.set(false);
}
// 使用自定义线程池,根据实际需要配置
public Executor taskExecutor() {
// 自定义线程池的逻辑
return null;
}
}
在这个例子中,我们定义了一个DynamicScheduleConfig
类,实现了SchedulingConfigurer
接口。我们使用了AtomicBoolean
来控制定时任务的启动和停止,这样做是线程安全的。通过调用startTask()
和stopTask()
方法,我们可以动态地启动和停止定时任务。
这个例子展示了如何在Spring Boot应用中实现动态定时任务的启动和停止,这对于需要根据外部条件或用户交互动态调整任务执行频率的场景非常有用。
评论已关闭