【SpringBoot笔记16】SpringBoot集成Quartz实现定时任务功能

这篇文章,主要介绍SpringBoot框架如何集成Quartz实现定时任务功能。

目录

一、Spring定时任务

1.1、创建定时任务类

1.2、启动类开启定时任务

1.3、运行测试

1.4、定时任务不生效原因

二、SpringBoot集成Quartz

2.1、Quartz介绍

2.2、引入Quartz依赖

2.3、创建Job任务

(1)QuartzJobBean类

(2)JobDetail类

2.4、创建Trigger对象

2.5、组合Job和Trigger

2.6、完整代码

2.7、运行测试


一、Spring定时任务

Spring框架中提供了定时任务的功能,通过在方法上面,添加【@Scheduled】注解就可以实现定时执行代码的功能,下面介绍如何使用。

1.1、创建定时任务类

在需要定时执行的方法上面,添加【@Scheduled】注解,指定执行频率即可,一般采用cron表达式。

  • 注意之处:执行定时任务的方法,所在的类必须是能够被SpringBoot管理的,一般会使用【@Component】注解标记。
package com.spring.boot.demo.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/10/27 12:41
 * @Description
 */
// 将当前类添加到 IOC 容器里面
@Component
public class TaskDemo {

    /**
     * 使用注解设置定时任务执行时间
     */
    @Scheduled(cron = "0/10 * * * * ? ")
    public void runTask() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date());
        System.out.println("执行runTask方法: " + date);
    }

}

1.2、启动类开启定时任务

SpringBoot框架中,要使用定时任务的功能,需要使用【@EnableScheduling】注解,手动开启定时任务的功能,一般在启动类上面添加即可。

package com.spring.boot.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/10/267 12:31
 * @Description 启动类
 */
// 开启Spring的定时任务功能
@EnableScheduling
@SpringBootApplication // 这个表示标记当前类是一个SpringBoot应用程序
public class Application {
    public static void main(String[] args) {
        // 启动应用程序
        SpringApplication.run(Application.class, args);
    }
}

1.3、运行测试

启动工程,查看控制台日志输出,可以看到每隔10秒,对应的方法就会执行一次,那就表示定时任务设置成功啦。

【SpringBoot笔记16】SpringBoot集成Quartz实现定时任务功能_第1张图片

1.4、定时任务不生效原因

一般情况下,定时任务不生效的原因有可能是:

  • 当前类,不在SpringBoot所管理的范围下面,此时可以通过添加【@Component】注解。

二、SpringBoot集成Quartz

Spring提供的定时任务可以满足大多数情况,但是它有一定的缺点,例如:不能动态的设置定时任务,不能再分布式的环境下面使用。而我们接下来介绍的Quartz,它就可以实现前面说的两个功能,它可以动态的设置定时任务、能够在分布式环境下面使用,下面介绍一下SpringBoot框架如何使用Quartz。

2.1、Quartz介绍

Quartz是一个实现定时任务的框架,它主要由三部分组成,分别是:Job任务、Trigger触发器、Scheduler调度器。

  • Job任务:这是实际需要执行业务逻辑的方法,Quartz将其抽象成了一个Job对象。
  • Trigger触发器:什么时候、什么条件下,应该执行Job任务呢,Quartz将其抽象成了一个Trigger对象。
  • Scheduler调度器:当满足了执行条件时候,就要进行调度执行Job任务啦,Quartz将这个调度动作抽象成了一个Scheduler对象。

Quartz定时任务的大致关系如下图所示:

【SpringBoot笔记16】SpringBoot集成Quartz实现定时任务功能_第2张图片

2.2、引入Quartz依赖

SpringBoot框架已经提供了Quartz的starter启动器,我们只需要在pom文件里面引入【spring-boot-starter-quartz】依赖即可。



    org.springframework.boot
    spring-boot-starter-quartz

2.3、创建Job任务

(1)QuartzJobBean类

SpringBoot框架里面,提供了一个【QuartzJobBean】类,我们自己编写的Job任务,只需要继承这个【QuartzJobBean】类,然后重写里面的【executeInternal()】方法即可。

package com.spring.boot.demo.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/10/27 21:54
 * @Description
 */
public class DemoJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        // TODO 这里就是具体编写定时任务要执行的代码
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date());
        System.out.println("执行runTask方法: " + date);
    }
    
}

(2)JobDetail类

Quartz针对每一个Job任务,它都提供了一个JobDetail对象,该对象用于描述Job任务的一些详细信息,例如:任务名称、任务分组、任务参数、任务是否可以被持久化、任务是否可以被恢复执行等等。

  • 任务名称、任务分组通过一个JobKey对象来描述,key表示任务名称,value表示属于分组,默认DEFAULT。
  • 任务描述,通过description字符串表示。
  • 任务参数,通过JobDataMap保存任务的参数数据,任务执行过程中,可以从JobDataMap对象中获取到传递的参数。
  • 任务是否存储,通过durability来设置,true表示可持久,默认false。
  • 任务是否可恢复执行,通过shouldRecover来设置,true表示可以恢复执行,默认是false。

如何创建JobDetail对象呢???

quartz里面提供了【JobBuilder】类,可以采用构建者模式进行链式调用,主要方法有如下这些:

  • withDescription()方法:设置任务的描述信息。
  • withIdentity()方法:设置任务的名称、任务的分组。
  • build()方法:返回创建的JobDetail对象。
// 创建 JobDetail
JobDetail jobDetail = JobBuilder.newJob(DemoJob.class)
        .withDescription("这是创建任务的描述信息")
        .withIdentity("这是任务名称", "这是任务分组名称")
        .build();

2.4、创建Trigger对象

创建Trigger之前,需要创建一个调度器构建器对象,常见的有四种构建器对象,如下所示:

  • SimpleScheduleBuilder: 简单调度构建器,这个构建器主要提供了【时分秒】粒度的任务执行频率。
  • CalendarIntervalScheduleBuilder: 时间间隔调度构建器,这个构建器主要提供【时分秒,年月日周】间隔的任务执行频率。
  • CronScheduleBuilder: Cron表达式调度构建器,支持cron表达式执行任务。
  • DailyTimeIntervalScheduleBuilder: 可以构建更加复杂的触发器,例如:每周的周六和周日执行。

常用的应该是【CronScheduleBuilder】,它是采用cron表达式设置的定时任务。

如何创建Trigger触发器对象???

使用【TriggerBuilder】类,可以调用【newTrigger()】方法创建一个Trigger对象。

// 创建调度器构建器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");

// 创建触发器
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
        .withSchedule(cronScheduleBuilder)
        .withDescription("这是触发器的描述信息")
        .withIdentity("这是触发器名称", "这是触发器分组名称")
        .startNow()
        .build();

2.5、组合Job和Trigger

通过Scheduler调度器,将Job和Trigger组合起来,最后调用【start()】方法,启动定时任务。

// 绑定 Job 和 Trigger
scheduler.scheduleJob(jobDetail, cronTrigger);
// 启动
scheduler.start();

2.6、完整代码

package com.spring.boot.demo.quartz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/10/27 22:00
 * @Description
 */
@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("/start")
    public String start() throws SchedulerException {
        // 1、创建调度器工厂
        SchedulerFactory factory = new StdSchedulerFactory();
        // 2、从工厂中获取具体的调度器
        Scheduler scheduler = factory.getScheduler();

        // 创建 JobDetail
        JobDetail jobDetail = JobBuilder.newJob(DemoJob.class)
                .withDescription("这是创建任务的描述信息")
                .withIdentity("这是任务名称", "这是任务分组名称")
                .build();

        // 创建调度器构建器
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");

        // 创建触发器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withSchedule(cronScheduleBuilder)
                .withDescription("这是触发器的描述信息")
                .withIdentity("这是触发器名称", "这是触发器分组名称")
                .startNow()
                .build();

        // 绑定 Job 和 Trigger
        scheduler.scheduleJob(jobDetail, cronTrigger);
        // 启动
        scheduler.start();
        return "任务启动成功";
    }

}

2.7、运行测试

启动工程,浏览器访问【http://localhost:8080/api/start】地址,查看控制台输出日志,如下所示:

【SpringBoot笔记16】SpringBoot集成Quartz实现定时任务功能_第3张图片

到此,SpringBoot集成Quartz实现定时任务就成功啦。

综上,这篇文章结束了,主要介绍SpringBoot框架如何集成Quartz实现定时任务功能。

你可能感兴趣的:(SSM专栏,spring,boot,spring,java,Quartz,定时任务)