ScheduledFuture动态定时任务实现,可进行任务取消以及任务执行时间修改

一,配置定时任务线程池

@Configuration
public class ScheduledConfig {
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(3);
        threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);
        return threadPoolTaskScheduler;
    }
}

二,定时任务存储类

/**
 * 定时任务执行的包装类
 */
@Data
public class ScheduledFutureHolder {
    private ScheduledFuture<?> scheduledFuture;

    private String uuid;

    private String corn;

}

三,定时任务容器,以及定时任务启动和取消

    //定时任务容器
    private  Map<String, ScheduledFutureHolder> scheduleMap = new ConcurrentHashMap<>();

    //引入定时任务线程池
 
    private final ThreadPoolTaskScheduler threadPoolTaskScheduler;


    //启动定时任务
     ScheduledFuture<?> schedule = threadPoolTaskScheduler.schedule(new BackupTask(), new CronTrigger("cron表达式"));

        //备份异步定时任务
    class BackupTask implements Runnable {

        @Override
        public void run() {
            //                Task(one, backupParam);
            System.out.println("测试+“-----------------------------------------”");
        }
    }


   //停止定时任务
           ScheduledFutureHolder scheduledFutureHolder = scheduleMap.get(backupConfigService.getOne(new LambdaQueryWrapper<BackupConfig>().eq(BackupConfig::getId, deleteBackupConfigParam.getId())).getScheduledStr());
        ScheduledFuture<?> scheduledFuture = scheduledFutureHolder.getScheduledFuture();
        //停止定时任务
        boolean cancel = scheduledFuture.cancel(true);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在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"); ``` 这样我们就可以动态调整定时任务执行时间了。需要注意的是,修改任务执行时间时需要先删除旧的任务再添加新的任务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EntyIU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值