springboot 定时任务实现的三种方法

springboot 定时任务

1.静态实现
  • 使用 @Scheduled 注解
  • SpringBoot 启动类或者当前类上添加启动定时任务注解 @EnableScheduling
  • 添加 @Component 注册为 bean
@Component
@EnableScheduling
public class SchedualerTasks {

  private final Logger logger = LoggerFactory.getLogger(this.getClass());
  private static final DateFormat DATA_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

  @Autowired
  private Service Service;
  
   @Scheduled(cron = "0/15 * * * * *")
   public void taskConfigurer() {
       // 需要实现的任务逻辑
       System.out.println("=====================>定时任务<=====================");
       service.doWork();
       logger.info("cron定时任务: " + "时间:【{}】", DATA_FORMAT.format(Calendar.getInstance().getTime()));
   }
}
2.配置文件配置定时任务时间
  • 需要实现 SchedulingConfigurer 接口
  • SpringBoot 启动类或者当前类上添加启动定时任务注解 @EnableScheduling
  • 添加 @Component 注册为 bean
@Component
@EnableScheduling
public class SchedualerTasks implements SchedulingConfigurer {

   private final Logger logger = LoggerFactory.getLogger(this.getClass());
   private static final DateFormat DATA_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
   
   @Value("${server.scheduler.cron}")
   private String cron;
   @Autowired
   private Service Service;
  
   @Override
   public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
       taskRegistrar.addTriggerTask(() -> {
           // 需要实现的任务逻辑
           System.out.println("=====================>定时任务<=====================");
           service.doWork();
           logger.info("动态定时任务: " + "时间:【{}】", DATA_FORMAT.format(Calendar.getInstance().getTime()));

       }, triggerContext -> {
           //任务触发,可修改任务的执行周期
           CronTrigger trigger = new CronTrigger(cron);
           Date nextExec = trigger.nextExecutionTime(triggerContext);
           return nextExec;
       });
   }

}
配置文件application.properties
server.scheduler.cron=0 0 * * * *
3. 动态设置任务启动、结束、更改调度时间
  • 需要实现 SchedulingConfigurer 接口
  • SpringBoot 启动类或者当前类上添加启动定时任务注解 @EnableScheduling
  • 添加 @Component 注册为 bean
DynamicTasks .class
/**
* 利用线程池实现任务调度
* Task任务调度器可以实现任务的调度和删除
* 原理:
* 实现一个类:ThreadPoolTaskScheduler线程池任务调度器,能够开启线程池进行任务调度
* ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduleFuture,
* 在这个方法中添加两个参数一个是Runable:线程接口类,和CronTrigger(定时任务触发器)
* 在ScheduleFuture中有一个cancel可以停止定时任务
* <p>
* Scheduled Task是一种轻量级的任务定时调度器,相比于Quartz,减少了很多的配置信息,但是Scheduled Task
* 不适用于服务器集群,引文在服务器集群下会出现任务被多次调度执行的情况,因为集群的节点之间是不会共享任务信息的
* 每个节点的定时任务都会定时执行
*/
@Component
public class DynamicTasks {

   private final Logger logger = LoggerFactory.getLogger(this.getClass());
   private static final DateFormat DATA_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

   @Bean
   public ThreadPoolTaskScheduler taskScheduler() {
       return new ThreadPoolTaskScheduler();
   }

   @Autowired
   private ThreadPoolTaskScheduler taskScheduler;
   private ScheduledFuture<?> future;
   
   public void startTask(String cron) {
       logger.info("定时任务启动...");
       future = taskScheduler.schedule(new MyTask(), new CronTrigger(cron));
   }

   public void stopTask() {
       logger.info("定时任务关闭...");
       if (future != null) {
           future.cancel(true);
       }
   }

   public void changeTaskTime(String newCron) {
       logger.info("定时任务调度时间改变...");
       stopTask();
       startTask(newCron);
   }

   private class MyTask implements Runnable {
       @Override
       public void run() {
           // 需要实现的任务逻辑
           System.out.println("********************>>>定时任务<<<********************");
           logger.info("cron定时任务: " + "时间:【{}】", DATA_FORMAT.format(Calendar.getInstance().getTime()));
       }
   }
}
controller.class
@RestController
public class SchedualerController {

    @Autowired
    private DynamicTasks dynamicTasks;

    @GetMapping("/startTask")
    public void startMyTask(@RequestParam("cron") String cron) {
        dynamicTasks.startTask(cron);
    }

    @GetMapping("/stopMyTask")
    public void stopMyTask() {
        dynamicTasks.stopTask();
    }

    @GetMapping("/changeMyTaskTime")
    public void changeMyTaskTime(@RequestParam("newCron") String newCron) {
        dynamicTasks.changeTaskTime(newCron);
    }
}

Spring Boot 定时任务参数说明

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

God__is__a__girl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值