Springboot项目中定时任务的四种实现方式

2024-06-04 9061阅读

文章目录

    • 1. 使用@Scheduled注解
      • 1.1 时间间隔执行
      • 1.2 固定时间点执行
      • 2. 使用@EnableScheduling注解启用定时任务
      • 3. 实现SchedulingConfigurer接口
      • 4. 使用Quartz框架
        • 4.1 配置QuartzScheduler
        • 4.2 定义Job类和Trigger类
        • 5. 总结

          Springboot项目中定时任务的四种实现方式 第1张

          在开发现代应用时,定时任务是一个非常常见的需求。无论是数据清理、数据同步、报表生成还是其他周期性任务,都可以通过定时任务来实现。Spring框架为我们提供了多种实现定时任务的方式,让我们可以根据项目的需求和特点来选择合适的方式。

          1. 使用@Scheduled注解

          Spring的@Scheduled注解是一种非常简单和便捷的实现定时任务的方式。通过在方法上添加@Scheduled注解,我们可以指定方法在特定的时间间隔或固定的时间点执行。

          1.1 时间间隔执行

          @Component
          public class ScheduledTasks {
              @Scheduled(fixedRate = 5000) // 每隔5秒执行一次
              public void task1() {
                  // 定时任务逻辑
              }
              @Scheduled(fixedDelay = 10000) // 上次执行结束后延迟10秒再执行
              public void task2() {
                  // 定时任务逻辑
              }
              @Scheduled(initialDelay = 5000, fixedRate = 10000) // 延迟5秒后,每隔10秒执行一次
              public void task3() {
                  // 定时任务逻辑
              }
          }
          

          1.2 固定时间点执行

          @Component
          public class ScheduledTasks {
              @Scheduled(cron = "0 0 0 * * ?") // 每天零点执行
              public void task4() {
                  // 定时任务逻辑
              }
              @Scheduled(cron = "0 0 12 * * MON-FRI") // 每个工作日中午12点执行
              public void task5() {
                  // 定时任务逻辑
              }
          }
          

          2. 使用@EnableScheduling注解启用定时任务

          除了在定时任务类中直接使用@Scheduled注解外,我们还可以通过在主类上添加@EnableScheduling注解来启用定时任务功能。

          @SpringBootApplication
          @EnableScheduling
          public class Application {
              public static void main(String[] args) {
                  SpringApplication.run(Application.class, args);
              }
          }
          

          然后在定时任务类中使用@Scheduled注解定义定时任务方法,与之前的方式相同。

          3. 实现SchedulingConfigurer接口

          如果我们需要更灵活地配置定时任务,比如动态地改变定时任务的执行频率或者添加多个定时任务,可以通过实现SchedulingConfigurer接口来实现。

          @Configuration
          @EnableScheduling
          public class ScheduledConfig implements SchedulingConfigurer {
              @Override
              public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
                  taskRegistrar.addTriggerTask(
                      () -> {
                          // 定时任务逻辑
                      },
                      triggerContext -> {
                          CronTrigger cronTrigger = new CronTrigger("0 0 0 * * ?"); // 每天零点执行
                          return cronTrigger.nextExecutionTime(triggerContext);
                      }
                  );
              }
          }
          

          4. 使用Quartz框架

          如果需要更强大和灵活的定时任务功能,比如支持集群部署、任务调度、错过任务处理等,可以选择集成Quartz框架。

          4.1 配置QuartzScheduler

          首先需要配置QuartzScheduler,在Spring Boot中可以通过配置文件或者Java代码来配置。

          @Configuration
          public class QuartzConfig {
              @Bean
              public SchedulerFactoryBean schedulerFactoryBean() {
                  SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
                  // 其他配置
                  return schedulerFactoryBean;
              }
          }
          

          4.2 定义Job类和Trigger类

          @Component
          public class MyJob implements Job {
              @Override
              public void execute(JobExecutionContext context) throws JobExecutionException {
                  // 定时任务逻辑
              }
          }
          @Configuration
          public class QuartzConfig {
              @Bean
              public JobDetail myJobDetail() {
                  return JobBuilder.newJob(MyJob.class)
                      .withIdentity("myJob")
                      .storeDurably()
                      .build();
              }
              @Bean
              public Trigger myTrigger() {
                  return TriggerBuilder.newTrigger()
                      .forJob(myJobDetail())
                      .withIdentity("myTrigger")
                      .withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 * * ?")) // 每天零点执行
                      .build();
              }
          }
          

          5. 总结

          通过上述的四种方法的实践,无论使用简单的@Scheduled注解还是更灵活的Quartz框架,都可以满足不同项目的需求。选择合适的方式,并结合实际场景,定时任务将为你的应用增添更多的价值和灵活性。

          Springboot项目中定时任务的四种实现方式 第2张


          难熬的日子总会过去,不信你回头看看,你都已经在不知不觉中,熬过来很多苦难,余生很长,不必慌张。



    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]