• Spring Boot 集成 Quartz 实现定时任务


    Spring Boot 集成 Quartz 实现定时任务

    在Spring Boot应用中,我们经常需要执行一些定时任务,如每天发送报表、定时更新数据库等。虽然Spring Framework自带了一个简单的定时任务功能(@Scheduled),但在一些复杂场景下,我们可能需要更强大的定时任务框架,这时Quartz就是一个很好的选择。

    Quartz是一个开源的作业调度框架,它允许你以非常灵活的方式定义任务执行的时间表。它可以与Spring Boot非常方便地集成,下面我们就来看看如何在Spring Boot应用中集成Quartz来实现定时任务。

    1. 添加依赖

    首先,你需要在你的pom.xml文件中添加Spring Boot Starter Quartz的依赖:

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-quartzartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2. 创建定时任务

    创建一个实现了Job接口的类,这个类将包含你想要定时执行的代码:

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    public class MyQuartzJob implements Job {
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            // 这里写你的定时任务逻辑
            System.out.println("Quartz Job is running...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3. 配置Quartz

    在你的Spring Boot配置类中,你需要配置一个JobDetail,一个Trigger,以及一个Scheduler来调度你的任务。但是,由于Spring Boot Starter Quartz已经为我们提供了自动配置,所以大部分情况下你不需要手动配置这些bean。

    不过,为了演示如何自定义配置,我们可以创建一个配置类:

    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.SimpleScheduleBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
    import org.springframework.scheduling.quartz.JobDetailFactoryBean;
    
    @Configuration
    public class QuartzConfig {
    
        @Bean
        public JobDetail myQuartzJobDetail() {
            return JobBuilder.newJob(MyQuartzJob.class)
                    .withIdentity("myQuartzJob")
                    .storeDurably()
                    .build();
        }
    
        @Bean
        public Trigger myQuartzTrigger() {
            SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(10) // 设置时间间隔为10秒
                    .repeatForever(); // 无限重复
    
            return TriggerBuilder.newTrigger()
                    .forJob(myQuartzJobDetail())
                    .withIdentity("myTrigger")
                    .withSchedule(scheduleBuilder)
                    .build();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    注意:在Spring Boot 2.0及更高版本中,CronTriggerFactoryBeanJobDetailFactoryBean已经被废弃,建议使用JobBuilderTriggerBuilder来构建任务和触发器。

    然而,实际上在Spring Boot应用中,你通常不需要手动创建这些bean,因为Spring Boot会自动配置它们。你只需要在你的定时任务类上使用@Component注解,并在配置文件中指定定时任务的cron表达式即可。但这里为了演示如何自定义Quartz的配置,我们还是手动创建了这些bean。

    不过,在实际应用中,你可能更倾向于使用Spring Boot的自动配置功能,并通过配置文件来定义你的定时任务。例如,你可以在application.propertiesapplication.yml文件中添加类似下面的配置:

    application.properties:

    spring.quartz.job-store-type=memory
    spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
    
    # 定义定时任务
    spring.quartz.job-details.myJob.job-class=com.example.MyQuartzJob
    spring.quartz.job-details.myJob.group=MY_GROUP
    spring.quartz.job-details.myJob.data=any-job-data-you-might-need
    spring.quartz.job-details.myJob.durability=true
    
    # 定义触发器
    spring.quartz.triggers.myTrigger.job=myJob
    spring.quartz.triggers.myTrigger.group=MY_GROUP
    # 使用CRON表达式定义触发时间
    spring.quartz.triggers.myTrigger.cron=0/10 * * * * ? # 每10秒执行一次
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    或者使用YAML格式的配置文件:

    application.yml:

    spring:
      quartz:
        job-store-type: memory
        properties:
          org:
            quartz:
              scheduler:
                instanceId: AUTO
        job-details:
          myJob:
            job-class: com.example.MyQuartzJob
            group: MY_GROUP
            data: any-job-data-you-might-need
            durability: true
        triggers:
          myTrigger:
            job: myJob
            group: MY_GROUP
            cron: "0/10 * * * * ?" # 每10秒执行一次
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这个配置中,我们定义了一个名为myJob的定时任务和一个名为myTrigger的触发器。触发器使用CRON表达式来指定任务的执行时间。这个配置将自动被Spring Boot的自动配置功能所识别,并创建相应的Quartz组件。你不需要手动创建任何bean。你只需要确保你的定时任务类(在这个例子中是MyQuartzJob)被Spring容器管理即可(例如,通过添加@Component注解)。然后,当应用启动时,Spring Boot将自动启动Quartz调度器,并按照你指定的时间表来执行你的定时任务。

  • 相关阅读:
    基于SSM的社会救助信息管理毕业设计源码211633
    2022-07-18 jenkins部署
    vulnhub靶场之EVILBOX: ONE
    Vue中实现div的任意移动
    回归预测 | MATLAB实现BO-LSSVM贝叶斯优化算法优化最小二乘支持向量机数据回归预测(多指标,多图)
    python提效小工具-统计xmind用例数量
    Java反编译生成java文件
    论文解读:SlowFast Networks for Video Recognition
    400Gbps 网络面临的挑战
    接口测试工具那么多,新公司用的自己没接触过怎么办?
  • 原文地址:https://blog.csdn.net/li371518473/article/details/136309702