这篇文章,主要介绍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框架中提供了定时任务的功能,通过在方法上面,添加【@Scheduled】注解就可以实现定时执行代码的功能,下面介绍如何使用。
在需要定时执行的方法上面,添加【@Scheduled】注解,指定执行频率即可,一般采用cron表达式。
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);
}
}
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);
}
}
启动工程,查看控制台日志输出,可以看到每隔10秒,对应的方法就会执行一次,那就表示定时任务设置成功啦。
一般情况下,定时任务不生效的原因有可能是:
Spring提供的定时任务可以满足大多数情况,但是它有一定的缺点,例如:不能动态的设置定时任务,不能再分布式的环境下面使用。而我们接下来介绍的Quartz,它就可以实现前面说的两个功能,它可以动态的设置定时任务、能够在分布式环境下面使用,下面介绍一下SpringBoot框架如何使用Quartz。
Quartz是一个实现定时任务的框架,它主要由三部分组成,分别是:Job任务、Trigger触发器、Scheduler调度器。
Quartz定时任务的大致关系如下图所示:
SpringBoot框架已经提供了Quartz的starter启动器,我们只需要在pom文件里面引入【spring-boot-starter-quartz】依赖即可。
org.springframework.boot
spring-boot-starter-quartz
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);
}
}
Quartz针对每一个Job任务,它都提供了一个JobDetail对象,该对象用于描述Job任务的一些详细信息,例如:任务名称、任务分组、任务参数、任务是否可以被持久化、任务是否可以被恢复执行等等。
如何创建JobDetail对象呢???
quartz里面提供了【JobBuilder】类,可以采用构建者模式进行链式调用,主要方法有如下这些:
// 创建 JobDetail
JobDetail jobDetail = JobBuilder.newJob(DemoJob.class)
.withDescription("这是创建任务的描述信息")
.withIdentity("这是任务名称", "这是任务分组名称")
.build();
创建Trigger之前,需要创建一个调度器构建器对象,常见的有四种构建器对象,如下所示:
常用的应该是【CronScheduleBuilder】,它是采用cron表达式设置的定时任务。
如何创建Trigger触发器对象???
使用【TriggerBuilder】类,可以调用【newTrigger()】方法创建一个Trigger对象。
// 创建调度器构建器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
// 创建触发器
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withSchedule(cronScheduleBuilder)
.withDescription("这是触发器的描述信息")
.withIdentity("这是触发器名称", "这是触发器分组名称")
.startNow()
.build();
通过Scheduler调度器,将Job和Trigger组合起来,最后调用【start()】方法,启动定时任务。
// 绑定 Job 和 Trigger
scheduler.scheduleJob(jobDetail, cronTrigger);
// 启动
scheduler.start();
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 "任务启动成功";
}
}
启动工程,浏览器访问【http://localhost:8080/api/start】地址,查看控制台输出日志,如下所示:
到此,SpringBoot集成Quartz实现定时任务就成功啦。
综上,这篇文章结束了,主要介绍SpringBoot框架如何集成Quartz实现定时任务功能。