【定时任务】Spring Boot 中如何使用 Quartz

时间:2023-03-09 00:31:02
【定时任务】Spring Boot 中如何使用 Quartz

这篇文章将介绍如何在Spring Boot 中使用Quartz。

一、首先在 pom.xml 中添加 Quartz 依赖。

     <!-- quartz依赖 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency> <!-- 该依赖必加,里面有spring对schedule的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>

二、编写任务类,里面编写希望得到定时执行的具体任务。注意在任务类上需要添加 @Component 注解,方便Spring 扫描到该组件并注解到Spring 容器中。

/**
* 定时任务
* @author lWX515915
*
*/
@Component
public class MyTask{ public void task1() {
System.out.println("this is task1 time: " + new Date());
} }

三、然后编写配置类 QuartzConfig ,该类中使用Java代码详细描述了如何配置Quartz。类前添加@Configuration注解 表示这是配置类

@Configuration 表示这个类会声明一个或者多个 Bean 类 并且有可能会被Spring 容器处理来生成bean的定义和bean对应的服务请求。

在configuration类中,我们需要对三个对象JobDetail、Trigger 和 Scheduler 进行配置。

/**
* Quartz配置类
* @author lWX515915
*
*/
@Configuration
public class QuartzConfig
{
...
}

1、配置JobDetail

  @Bean表示该方法返回一个bean,并交付Spring容器管理 。

  参数是任务,setTargetObject 是设置具体的执行目标,setTargetMethod 是设置具体的执行方法。

  MethodInvokingJobDetailFactoryBean 是JobDetail 的 bean 工厂。

  /**
* 配置JobDetail
* @param scheduledTask 需要被执行的任务
* @return
*/
@Bean(name="jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(MyTask task) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); jobDetail.setConcurrent(false);//设置多任务是否采用并发模式 jobDetail.setName("job1");
jobDetail.setGroup("group1"); jobDetail.setTargetObject(task); //设置具体执行目标
jobDetail.setTargetMethod("task1"); //设置具体执行方法 return jobDetail;
}

2、配置 Trigger

  其中参数表示JobDetail,这里就是我们之前注册到Spring 容器中的JobDetail bean。

  setJobDetail 设置具体的任务。

  setCronExpression 设置cron 表达式。

  返回值是CronTriggerFactoryBean,是一个CronTrigger对应的bean factory。

  /**
* 配置trigger
* @param jobDetail
* @return
*/
@Bean(name="jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
CronTriggerFactoryBean jobTrigger = new CronTriggerFactoryBean();
jobTrigger.setJobDetail(jobDetail.getObject());
jobTrigger.setCronExpression("0/10 * * ? * *");
jobTrigger.setName("jobTrigger");
return jobTrigger;
}

3、配置Scheduler

  其中setOverwriteExistingJobs 设置是否更新已经存在的job

  setTriggers 设置trigger

  返回scheduler 对应的bean工厂

  /**
* 配置调度器
* @param trigger
* @return
*/
@Bean(name="jobSchedule")
public SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean trigger) {
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); schedulerFactory.setOverwriteExistingJobs(true);//设置更新已经存在的job
schedulerFactory.setTriggers(trigger.getObject()); return schedulerFactory;
}

经过上面三个步骤,Quartz 的配置类就已经完成了

四、启动应用 查看结果,下面是运行的结果。可以看到实现了我们想要的结果。

【定时任务】Spring Boot 中如何使用 Quartz

综上,Spring Boot 中使用 Quartz 的关键在与 Quartz 的配置。