重写Spring Boot定时任务,支持可动态调整执行时间

本文介绍了如何在Spring Boot中重写定时任务,使其支持动态调整执行时间。通过自定义注解@CronScheduled,定义任务方法并注册定时任务,当检测到执行时间变化时,重新注册任务以实现动态调整。文章详细阐述了整个实现过程,包括任务的定义、注解的创建、任务的注册以及如何根据配置变化重新请求任务。
摘要由CSDN通过智能技术生成

 

Spring Boot应该是目前最火的java开源框架了,它简化了我们创建一个web服务的过程,让我们可以在很短时间、基本零配置就可以启动一个web服务。

定时任务在我们平常的业务开发用的非常多,Spring Boot创建一个定时任务很简单,只需要用@Scheduled注解方法,就可以让方法按照定义的时间进行运行。但是,Spring Boot的@Scheduled默认是单线程的,也就是如果有两个定时任务,那第二个定时必须在第一个定时任务执行完成之后才能开始执行。当然我们可以使用@Async让方法异步,来达到多线程的目的。但是,今天我要讲的是如何重写Spring Boot定时任务,并可支持动态调整执行时间。

1、定义我们需要定时触发的任务方法
重写Spring Boot定时任务,支持可动态调整执行时间
实例代码中我们定义了两个需要进行定时触发的任务。并且自定义注解@CronScheduled

2、自定义注解@CronScheduled
自定义注解的作用主要在于后续的逻辑可以获取到该方法的执行周期。同时也可以定义其它的属性,用于后续的业务逻辑处理

重写S

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

0NE-PIECE

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

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

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

打赏作者

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

抵扣说明:

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

余额充值