quartz是一个丰富的开源作业调度,使用quartz可以完成复杂的执行计划,它支持数据库、集群、插件以及邮件,并且支持cron表达式,具有极高的灵活性。
下面开始使用springboot整合quartz,github:https://github.com/fengqing11/springboot-quartz
创建项目,依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>xyz.fengqing11</groupId>
<artifactId>springboot-quartz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-quartz</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建两个job:
Job可以是普通的javabean,也可以继承QuartzJobBean。
使用javabean需要使用注解@Component。
继承QuartzJobBean需要实现executeInternal方法,该方法在使用任务调度时使用。
package xyz.fengqing11.springbootquartz.job;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyFirstJob {
public void sayHello() {
System.out.println("MyFirstJob sayHello:" + new Date());
}
}
package xyz.fengqing11.springbootquartz.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
public class MySecondJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("MySecondJob hello:" + name + ":" + new Date());
}
}
创建QuartzConfig:
对JobDetail和Trigger配置。
package xyz.fengqing11.springbootquartz.config;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.scheduling.quartz.*;
import xyz.fengqing11.springbootquartz.job.MySecondJob;
@Configuration
public class QuartzConfig {
@Bean
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean1(){
MethodInvokingJobDetailFactoryBean bean =
new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("sayHello");
return bean;
}
@Bean
JobDetailFactoryBean jobDetailFactoryBean2(){
JobDetailFactoryBean bean =
new JobDetailFactoryBean();
bean.setJobClass(MySecondJob.class);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name","sang");
bean.setJobDataMap(jobDataMap);
return bean;
}
@Bean
SimpleTriggerFactoryBean simpleTrigger(){
SimpleTriggerFactoryBean bean =
new SimpleTriggerFactoryBean();
bean.setJobDetail(jobDetailFactoryBean1().getObject());
bean.setRepeatCount(3);
bean.setStartDelay(1000);
bean.setRepeatInterval(2000);
return bean;
}
@Bean
CronTriggerFactoryBean cronTrigger(){
CronTriggerFactoryBean bean =
new CronTriggerFactoryBean();
bean.setJobDetail(jobDetailFactoryBean2().getObject());
bean.setCronExpression("* * * * * ?");
return bean;
}
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean =
new SchedulerFactoryBean();
SimpleTrigger simpleTrigger = simpleTrigger().getObject();
CronTrigger cronTrigger = cronTrigger().getObject();
bean.setTriggers(simpleTrigger,cronTrigger);
return bean;
}
}
代码解释:
- JobDetail的配置有两种方式:一种是通过MethodInvokingJobDetailFactoryBean类来配置,只需要指定Job实例名和要调用的方法即可。另一种是通过类JobDetailFactoryBean,这种方式需要指定Job的类名,然后通过JobDataMap传递参数到Job中,job中需要提供相应的set方法,才能接受到参数。
- Trigger有多种不同的实现方式,常用的是SimpleTrigger和CronTrigger,这两种Trigger分别使用SimpleTriggerFactoryBean和CronTriggerFactoryBean进行创建。在SimpleTriggerFactoryBean先设置setJobDetail,然后通过setRepeatCount设置任务的重复次数,setStartDelay设置任务启动延迟的时间,setRepeatInterval配置任务的时间间隔。CronTriggerFactoryBean则主要配置setJobDetail和setCronExpression。
- 最后通过SchedulerFactoryBean配置schedulerFactory,然后配置Trigger即可。
运行结果:
-end-