SpringBoot整合Quartz方法详解

  

下面我给您详细讲解“SpringBoot整合Quartz方法详解”的完整攻略。

一、简介

Quartz是一个任务调度框架,它能够让我们实现定时任务的调度,SpringBoot与Quartz的整合,可以让我们更加方便地实现定时任务的管理和调度。本篇文章将详细介绍SpringBoot如何整合Quartz框架。

二、准备工作

在开始整合之前,我们需要准备以下工作:

  1. JDK 1.8或以上
  2. Maven项目管理工具
  3. Eclipse或IntelliJ IDEA等Java开发工具
  4. SpringBoot及相关依赖(本文以2.3.0.RELEASE版本为例)
  5. Quartz相关依赖(本文以2.3.2版本为例)

三、创建项目

首先,我们需要在Eclipse或者IntelliJ IDEA等Java开发工具中,创建一个Maven项目,然后在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz-jobs</artifactId> 
    <version>2.3.2</version> 
</dependency>

这几个依赖分别是SpringBoot web、SpringBoot quartz和Quartz jobs的依赖。

四、配置Quartz

在项目根目录下,创建一个quartz.properties文件,添加如下配置:

org.quartz.scheduler.instanceName = Scheduler
org.quartz.scheduler.instanceId = AUTO

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDataSource
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.dataSource.myDataSource.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDataSource.URL = jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.myDataSource.user = root
org.quartz.dataSource.myDataSource.password = 123456
org.quartz.dataSource.myDataSource.maxConnections = 10

这里的配置项包括:Scheduler的实例名称、线程池的实现、Job存储的方式、数据源等。

五、编写定时任务

首先,我们需要编写一个定时任务类,如下:

@Component
public class TaskJob extends QuartzJobBean {

    private static Logger logger = LoggerFactory
            .getLogger(TaskJob.class);

    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {

        logger.info("[TaskJob正在执行]");
        // 执行具体的业务逻辑
        // ...
    }
}

这里我们使用@Component注解将定时任务类TaskJob注册为SpringBean,实现Spring与Quartz的无缝整合。

然后,在SpringBoot的配置类中配置SchedulerFactoryBean,如下:

@Configuration
public class QuartzConfig {

    @Autowired
    private TaskJob taskJob;

    /**
     * 创建JopDetail实例
     */
    @Bean(name = "jobDetail")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean() {

        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        // 是否并发执行
        bean.setConcurrent(false);
        // 设置定时任务的名字
        bean.setName("srdjan_job");
        // 设置定时任务的分组,这些属性都可以在数据库中进行修改
        bean.setGroup("srdjan");
        // 需要执行的对象
        bean.setTargetObject(taskJob);
        // 需要执行的方法
        bean.setTargetMethod("execute");
        return bean;

    }

    /**
     * 创建Trigger实例
     */
    @Bean(name = "jobTrigger")
    public CronTriggerFactoryBean cronTriggerFactoryBean() {

        CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
        stFactory.setJobDetail(detailFactoryBean().getObject());
        stFactory.setName("srdjan_trigger");
        // cron表达式,用于触发器
        stFactory.setCronExpression("0/5 * * * * ? *");
        return stFactory;

    }

    /**
     * 创建Scheduler实例
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory() {

        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 设置Quartz参数
        bean.setOverwriteExistingJobs(true);
        // 延时启动,应用启动1秒后
        bean.setStartupDelay(1);
        // 注册触发器
        bean.setTriggers(cronTriggerFactoryBean().getObject());
        return bean;

    }
}

这里的配置包括:定义JopDetail实例、定义Trigger实例、定义Scheduler实例。

六、运行项目

代码编写完成后,我们可以在指定的时间点查看到Job已经被调度起来了。当然,这需要我们先启动SpringBoot项目,然后等待定时任务的触发时间到来。

其中一个示例代码的运行结果如下所示:

2021-06-22 09:38:00.127  INFO 4696 --- [   scheduling-1] c.w.s.q.TaskJob                      : [TaskJob正在执行]
2021-06-22 09:38:05.133  INFO 4696 --- [   scheduling-1] c.w.s.q.TaskJob                      : [TaskJob正在执行]
2021-06-22 09:38:10.127  INFO 4696 --- [   scheduling-1] c.w.s.q.TaskJob                      : [TaskJob正在执行]

七、总结

通过本文的介绍,我们已经成功实现了SpringBoot与Quartz的整合,进而实现了定时任务的调度。在实际开发过程中,我们可以根据自身需求,更加灵活地配置定时任务的执行策略。

另外,本文中的示例代码已经上传至GitHub,供大家参考:https://github.com/JustDoItSrdjan/SpringBoot-Quartz

希望通过本文的学习,能够让大家对SpringBoot与Quartz的整合有更深入的认识,并且能够顺利地实现自己的定时任务需求。

相关文章