Spring Boot整合Quartz定时任务详解

发布于:2024-10-17 ⋅ 阅读:(16) ⋅ 点赞:(0)

在Spring Boot项目中,整合Quartz框架可以实现强大的定时任务调度功能。Quartz是一个开源的作业调度框架,支持复杂的调度方案以及灵活的作业触发器设置,能够满足多种定时任务需求。本文将详细介绍如何在Spring Boot中整合Quartz,实现单次执行、Cron表达式启动以及站厅任务(假设为周期性任务)的定时任务。

一、添加依赖

首先,在Spring Boot项目的pom.xml文件中添加Quartz和Spring Boot Starter Quartz的依赖:

<dependencies>
    <!-- Spring Boot Starter Quartz -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <!-- Quartz Scheduler -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.2</version>
    </dependency>
</dependencies>
二、实现单次执行的任务
  1. 创建任务类

    创建一个简单的任务类,继承QuartzJobBean并实现executeInternal方法。这个方法包含要执行的任务逻辑。

    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    
    public class SingleJob extends QuartzJobBean {
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("单次任务执行: " + System.currentTimeMillis());
        }
    }
    
  2. 创建配置类

    配置Quartz的调度器和触发器,并将任务类注册到调度器中。这里使用SimpleTriggerFactoryBean来创建一个简单触发器,并设置触发次数为1,以实现单次执行。

    import org.quartz.JobDetail;
    import org.quartz.Trigger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.quartz.JobDetailFactoryBean;
    import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
    
    @Configuration
    public class QuartzConfig {
    
        @Bean
        public JobDetail jobDetail() {
            JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
            factoryBean.setJobClass(SingleJob.class);
            factoryBean.setDurability(true);
            factoryBean.setName("singleJob");
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        }
    
        @Bean
        public Trigger trigger(JobDetail jobDetail) {
            SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
            factoryBean.setJobDetail(jobDetail);
            factoryBean.setRepeatCount(0); // 0表示只执行一次
            factoryBean.setRepeatInterval(1000); // 间隔1秒(虽然这里设置了间隔,但因为repeatCount为0,所以只执行一次)
            factoryBean.setName("singleTrigger");
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        }
    }
    
  3. 启动类

    在Spring Boot启动类上添加@EnableScheduling注解,启用定时任务功能。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @SpringBootApplication
    @EnableScheduling
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
三、使用Cron表达式启动任务
  1. 修改配置类

    使用CronTriggerFactoryBean来创建一个Cron触发器,并指定Cron表达式。

    import org.quartz.JobDetail;
    import org.quartz.Trigger;
    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 QuartzCronConfig {
    
        @Bean
        public JobDetail jobDetail() {
            JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
            factoryBean.setJobClass(SingleJob.class); // 可以使用同一个任务类
            factoryBean.setDurability(true);
            factoryBean.setName("cronJob");
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        }
    
        @Bean
        public Trigger cronTrigger(JobDetail jobDetail) {
            CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
            factoryBean.setJobDetail(jobDetail);
            factoryBean.setCronExpression("0 0/5 * * * ?"); // 每5分钟执行一次
            factoryBean.setName("cronTrigger");
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        }
    }
    
四、实现站厅任务(周期性任务)

站厅任务可以理解为周期性执行的任务,可以使用Cron表达式或SimpleTrigger来实现。这里以Cron表达式为例,已经在上一部分中实现。

五、总结

通过以上步骤,我们实现了在Spring Boot中整合Quartz框架,并分别实现了单次执行、Cron表达式启动以及周期性任务的定时任务。Quartz提供了丰富的定时任务管理功能,能够满足多种复杂的调度需求。在实际项目中,可以根据具体需求选择合适的触发器类型,并配置相应的调度规则。