建一个springboot项目:
https://blog.csdn.net/baidu_39298625/article/details/98102453
官方使用文档
https://www.w3cschool.cn/quartz_doc/quartz_doc-67a52d1f.html
版本:
spring-boot-starter-parent - 2.5.5
mybatis-spring-boot-starter - 2.2.2
druid-spring-boot-starter - 1.1.17
<?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.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>sbdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sbdemo</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-jdbc</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--spring boot集成quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
yml配置:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
business: # 配置业务数据源
url: jdbc:mysql:xxxx
username: xxx
password: xxxx
driver-class-name: com.mysql.cj.jdbc.Driver
quartz: #配置Quartz数据源
url: xxx
username: xxxx
password: xxxx
driver-class-name: com.mysql.cj.jdbc.Driver
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 15
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j2
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
remove-abandoned: true
remove-abandoned-timeout: 180
log-abandoned: true
quartz:
jdbc:
initialize-schema: never #配置是否每次重启项目都自动生成Quartz表结构,在此使用always生成一次后就可以改为never配置
job-store-type: jdbc
properties:
org:
quartz:
scheduler:
instanceName: etlCleanScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_ #Quartz表前缀
isClustered: true
clusterCheckinInterval: 10000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
#线程数 一个任务使用一个线程
threadCount: 100
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
quratz需要配置独立的数据源
package com.example.sbdemo.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Slf4j
@Configuration
public class DataSourceConfig {
private static final String DATASOURCE_NAME = "dbDataSource";
/**
* 数据源配置的前缀,必须与application.properties中配置的对应数据源的前缀一致
*/
private static final String BUSINESS_DATASOURCE_PREFIX = "spring.datasource.druid.business";
private static final String QUARTZ_DATASOURCE_PREFIX = "spring.datasource.druid.quartz";
@Primary
@Bean(name = DATASOURCE_NAME)
@ConfigurationProperties(prefix = BUSINESS_DATASOURCE_PREFIX)
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
/**
* @QuartzDataSource 注解则是配置Quartz独立数据源的配置
*/
@Bean
@QuartzDataSource
@ConfigurationProperties(prefix = QUARTZ_DATASOURCE_PREFIX)
public DruidDataSource quartzDataSource(){
return new DruidDataSource();
}
}
获取Scheduler实例
package com.example.sbdemo.config;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
/**
* @author issuser
* @title: SchedulerConfig
* @projectName sbdemo
* @description: TODO 获取Scheduler的实例
* @date 2022/3/22 16:31
*/
@Configuration
public class SchedulerConfig {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
/*
* 通过SchedulerFactoryBean获取Scheduler的实例
*/
@Bean(name="Scheduler")
public Scheduler scheduler() {
return schedulerFactoryBean.getScheduler();
}
}
编写一个Job类,实现Job接口,编写触发的业务逻辑,定时器到点就会执行里面的代码
package com.example.sbdemo.job;
import org.quartz.*;
import java.time.LocalDateTime;
/**
* @author issuser
* @title: getupJob
* @projectName sbdemo
* @description: TODO
* @date 2022/3/3016:12
*/
public class GetupJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Object tv1 = jobExecutionContext.getTrigger().getJobDataMap().get("t1");
Object tv2 = jobExecutionContext.getTrigger().getJobDataMap().get("t2");
Object jv1 = jobExecutionContext.getJobDetail().getJobDataMap().get("j1");
Object jv2 = jobExecutionContext.getJobDetail().getJobDataMap().get("j2");
Object sv = null;
try {
sv = jobExecutionContext.getScheduler().getContext().get("skey");
} catch (SchedulerException e) {
e.printStackTrace();
}
System.out.println(tv1+":"+tv2);
System.out.println(jv1+":"+jv2);
System.out.println(sv);
System.out.println("hello:"+ LocalDateTime.now());
}
}
调用定时器
package com.example.sbdemo.scheduler;
import com.example.sbdemo.job.GetupJob;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
/**
* @author issuser
* @title: CommScheduler
* @projectName sbdemo
* @description: TODO
* @date 2022/3/3016:16
*/
@Configuration
public class CommScheduler {
@Autowired @Qualifier("Scheduler")
private Scheduler scheduler;
public void addJob(){
//创建一个scheduler
try {
scheduler.getContext().put("skey", "svalue");
//创建一个Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.usingJobData("t1", "tv1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * ? ")).build();
trigger.getJobDataMap().put("t2", "tv2");
//创建一个job
JobDetail job = JobBuilder.newJob(GetupJob.class)
.usingJobData("j1", "jv1")
.withIdentity("myjob", "mygroup").build();
job.getJobDataMap().put("j2", "jv2");
//注册trigger并启动scheduler
scheduler.scheduleJob(job,trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
执行成功后quarzt对应的数据库会产生相应的数据

image.png