@scheduled注解配置时间_重写Spring Boot定时任务,支持可动态调整执行时间
时间: 2023-08-23 19:10:27 浏览: 153
spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法
在Spring Boot中,我们可以使用`@Scheduled`注解来配置定时任务。默认情况下,这个注解支持固定的时间表达式,例如:`@Scheduled(cron = "0 0 12 * * ?")`表示每天中午12点执行任务。
如果想要动态调整定时任务的执行时间,可以使用以下步骤:
1. 创建一个定时任务管理器类,用于管理所有的定时任务。这个类可以维护一个任务列表,每个任务都有一个唯一的ID和对应的执行时间表达式。
```
@Component
public class TaskManager {
private Map<String, ScheduledFuture<?>> tasks = new ConcurrentHashMap<>();
public void addTask(String id, Runnable task, String cronExpression) {
ScheduledFuture<?> future = taskScheduler().schedule(task, new CronTrigger(cronExpression));
tasks.put(id, future);
}
public void removeTask(String id) {
ScheduledFuture<?> future = tasks.get(id);
if (future != null) {
future.cancel(true);
tasks.remove(id);
}
}
public void updateTask(String id, String cronExpression) {
removeTask(id);
// 重新添加任务
// ...
}
private ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("TaskScheduler-");
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(60);
scheduler.initialize();
return scheduler;
}
}
```
2. 在需要执行的任务上添加`@Component`和`@Scope("prototype")`注解,这样每次调用`addTask`方法时都会创建一个新的任务实例。
```
@Component
@Scope("prototype")
public class MyTask implements Runnable {
private String id;
public MyTask(String id) {
this.id = id;
}
@Override
public void run() {
// 任务执行逻辑
}
}
```
3. 在需要动态调整执行时间的地方调用`TaskManager`的相关方法,例如:
```
@Autowired
private TaskManager taskManager;
@Autowired
private ApplicationContext context;
// 添加任务
MyTask task = context.getBean(MyTask.class, "task1");
taskManager.addTask("task1", task, "0 0/5 * * * ?");
// 修改任务执行时间
taskManager.updateTask("task1", "0 0/10 * * * ?");
// 删除任务
taskManager.removeTask("task1");
```
这样我们就可以动态调整定时任务的执行时间了。需要注意的是,修改任务执行时间时需要先删除旧的任务再添加新的任务。
阅读全文