【详解】Springquartz集(MySQL数据源)
【详解】Springquartz集(MySQL数据源)
简介
Quartz 是一个功能强大的调度库,可以在 Java 应用中用于执行定时任务。在单机环境中,Quartz 的配置和使用相对简单,但在分布式系统中,为了确保任务的唯一性和高可用性,通常需要将 Quartz 配置为集模式。本文将介绍如何在 Spring 框架下配置 Quartz 集,并使用 MySQL 作为数据源来存储调度信息。
环境准备
- Java 版本: 1.8 或更高
- Spring Boot 版本: 2..x
- Quartz 版本: 2..x
- 数据库: MySQL 5.7 或更高
步骤一:添加依赖
首先,在 pom.xml
文件中添加 Spring Boot 和 Quartz 的依赖:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Quartz Scheduler -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
步骤二:配置数据库
在 application.properties
中配置数据库连接:
spring.datasource.url=jdbc:mysql://localhost:06/quartz?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
步骤三:创建 Quartz 表
Quartz 需要一些特定的表来存储调度信息。可以使用 Quartz 提供的 SQL 脚本来创建这些表。对于 MySQL,可以使用 tables_mysql_innodb.sql
脚本。
将脚本中的 SQL 语句执行到 MySQL 数据库中:
代码语言:javascript代码运行次数:0运行复制-- 示例:创建 Quartz 表
CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_AME VARCHAR(120) OT ULL,
JOB_AME VARCHAR(200) OT ULL,
JOB_GROUP VARCHAR(200) OT ULL,
DESCRIPTIO VARCHAR(250) ULL,
JOB_CLASS_AME VARCHAR(250) OT ULL,
IS_DURABLE VARCHAR(1) OT ULL,
IS_OCOCURRET VARCHAR(1) OT ULL,
IS_UPDATE_DATA VARCHAR(1) OT ULL,
REQUESTS_RECOVERY VARCHAR(1) OT ULL,
JOB_DATA BLOB ULL,
PRIMARY KEY (SCHED_AME,JOB_AME,JOB_GROUP)
) EGIE=InnoDB;
-- 其他表创建语句...
步骤四:配置 Quartz 集
在 application.properties
中配置 Quartz 以启用集模式:
# Quartz 配置
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.quartz.properties.quartz.scheduler.instanceame=ClusteredScheduler
spring.quartz.properties.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.quartz.=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.quartz.jobStore.isClustered=true
spring.quartz.properties.quartz.=20000
spring.quartz.properties.quartz.=60000
spring.quartz.properties.quartz.=QRTZ_
步骤五:创建任务
定义一个简单的 Quartz 任务类:
代码语言:javascript代码运行次数:0运行复制import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
println("SimpleJob is running...");
}
}
步骤六:配置任务调度
在 Spring 配置类中配置任务调度:
代码语言:javascript代码运行次数:0运行复制import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.annotation.Bean;
import org.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean jobDetail() {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass();
factoryBean.setDurability(true);
return factoryBean;
}
@Bean
public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setRepeatInterval(10000); // 每10秒执行一次
factoryBean.setRepeatCount(SimpleTrigger.REPEAT_IDEFIITELY);
factoryBean.setStartDelay(0L);
factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_ISTRUCTIO_RESCHEDULE_EXT_WITH_REMAIIG_COUT);
return factoryBean;
}
}
步骤七:启动应用
启动 Spring Boot 应用程序,Quartz 将自动在集模式下运行,并且所有节点都会共享相同的调度信息。
参考资料
- Quartz 官方文档
- Spring Boot 官方文档
Spring Quartz 是一个非常流行的调度框架,用于在Java应用程序中执行定时任务。当使用Quartz与Spring框架结合时,可以通过配置MySQL作为数据源来实现集化部署,从而确保高可用性和负载均衡。
下面是一个简单的示例,展示如何在Spring Boot项目中配置和使用Spring Quartz集(使用MySQL作为数据源):
1. 添加依赖
首先,在pom.xml
文件中添加Spring Boot、Quartz和MySQL的依赖:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Quartz Scheduler -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- HikariCP Connection Pool -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
</dependencies>
2. 配置MySQL数据源
在application.properties
或application.yml
中配置MySQL数据源和Quartz的相关属性:
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:06/quartz_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=jdbc.Driver
# HikariCP连接池配置
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.=10
# Quartz配置
spring.quartz.job-store-type=jdbc
spring.quartz.properties.quartz.=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.quartz.=QRTZ_
spring.quartz.properties.quartz.jobStore.isClustered=true
spring.quartz.properties.quartz.=20000
spring.quartz.properties.quartz.scheduler.instanceame=ClusteredScheduler
spring.quartz.properties.quartz.scheduler.instanceId=AUTO
. 创建Quartz Job
创建一个简单的Quartz Job类,该类实现了Job
接口:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyJob implements Job {
private static final Logger logger = LoggerFactory.getLogger();
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
logger.info("Executing job at: " + new java.util.Date());
}
}
4. 配置Quartz Job和Trigger
在Spring Boot的配置类中定义Quartz Job和Trigger:
代码语言:javascript代码运行次数:0运行复制import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.annotation.Bean;
import org.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean jobDetail() {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass();
factoryBean.setDurability(true);
return factoryBean;
}
@Bean
public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setRepeatInterval(10000); // 每10秒执行一次
factoryBean.setRepeatCount(SimpleTrigger.REPEAT_IDEFIITELY);
factoryBean.setStartDelay(0);
factoryBean.setMisfireInstruction(SimpleScheduleBuilder.MISFIRE_ISTRUCTIO_FIRE_OW);
return factoryBean;
}
}
5. 启动Spring Boot应用
最后,创建一个Spring Boot启动类:
代码语言:javascript代码运行次数:0运行复制import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QuartzClusterApplication {
public static void main(String[] args) {
SpringApplication.run(, args);
}
}
6. 初始化Quartz表
确保在MySQL数据库中创建Quartz所需的表。可以使用Quartz提供的SQL脚本,通常位于Quartz的发行包中,或者从Quartz的GitHub仓库下载。
例如,使用以下命令创建表:
代码语言:javascript代码运行次数:0运行复制CREATE DATABASE quartz_db;
USE quartz_db;
-- 运行Quartz提供的SQL脚本
SOURCE path/to/tables_mysql_innodb.sql;
7. 测试
启动多个实例(每个实例运行在不同的端口上),观察日志输出,确保任务在集中的不同节点上交替执行。
以上就是一个完整的Spring Boot + Quartz + MySQL集配置示例。希望对你有所帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。在使用Spring与Quartz结合构建定时任务的集环境中,MySQL通常被用作持久化存储来确保任务的调度信息能够在集中的不同节点间共享。这样可以避免同一个任务在多个节点上重复执行,并且能够保证即使某个节点宕机,其他节点也能接管未完成的任务。
以下是一个详细的步骤和示例代码,介绍如何在Spring Boot项目中配置和使用Quartz集(MySQL数据源):
1. 添加依赖
首先,在pom.xml
文件中添加Spring Boot和Quartz的相关依赖:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
2. 配置Quartz
在application.properties
或application.yml
中配置Quartz连接到MySQL数据库:
# MySQL 数据库配置
spring.datasource.url=jdbc:mysql://localhost:06/quartz?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=jdbc.Driver
# Quartz 配置
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.quartz.properties.quartz.scheduler.instanceame=ClusteredScheduler
spring.quartz.properties.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.quartz.=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.quartz.jobStore.isClustered=true
spring.quartz.properties.quartz.=20000
spring.quartz.properties.quartz.=60000
spring.quartz.properties.quartz.=QRTZ_
spring.quartz.properties.=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.=10
. 创建定时任务
创建一个简单的定时任务类:
代码语言:javascript代码运行次数:0运行复制import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
println("MyJob is running on node " + context.getScheduler().getSchedulerInstanceId());
}
}
4. 配置Spring Boot启动类
在Spring Boot的启动类中配置Quartz Scheduler:
代码语言:javascript代码运行次数:0运行复制import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class QuartzInitializer implements CommandLineRunner {
@Autowired
private SchedulerFactory schedulerFactory;
@Override
public void run(String... args) throws Exception {
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
}
@Bean
public SchedulerFactory schedulerFactory() {
return new StdSchedulerFactory();
}
}
5. 定义Job和Trigger
使用Spring的@Configuration
类来定义Job和Trigger:
import org.quartz.*;
import org.annotation.Bean;
import org.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail myJobDetail() {
return ()
.withIdentity("myJob", "group1")
.build();
}
@Bean
public Trigger myJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever();
return ()
.forJob(myJobDetail())
.withIdentity("myJobTrigger", "group1")
.withSchedule(scheduleBuilder)
.build();
}
}
6. 启动应用
启动Spring Boot应用后,Quartz会根据配置自动创建并调度任务。由于配置了集模式,多个节点上的应用会共享相同的任务调度信息,确保任务不会重复执行。
注意事项
- 数据库表结构:确保MySQL数据库中有Quartz所需的表结构。可以通过设置
spring.quartz.jdbc.initialize-schema=always
来自动生成这些表。 - 集配置:确保每个节点的
instanceId
是唯一的,可以通过设置AUTO
来自动生成。 - 时间同步:确保集中的所有节点的时间同步,以避免因时间不一致导致的任务调度问题。
通过以上步骤,你可以在Spring Boot项目中成功配置和使用Quartz集(MySQL数据源)。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 17 条评论) |
本站网友 詹昊 | 30分钟前 发表 |
本站网友 wuli | 26分钟前 发表 |
JOB_AME | |
本站网友 治粉刺 | 25分钟前 发表 |
参考资料Quartz 官方文档Spring Boot 官方文档Spring Quartz 是一个非常流行的调度框架 | |
本站网友 感冒的食疗 | 30分钟前 发表 |
本站网友 中冶置业 | 6分钟前 发表 |
Quartz 的配置和使用相对简单 | |
本站网友 新能源概念股 | 20分钟前 发表 |
" + new java.util.Date()); } }4. 配置Quartz Job和Trigger在Spring Boot的配置类中定义Quartz Job和Trigger:代码语言:javascript代码运行次数:0运行复制import org.quartz.JobDetail; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.annotation.Bean; import org.annotation.Configuration; import org.springframework.scheduling.quartz.JobDetailFactoryBean; import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean; @Configuration public class QuartzConfig { @Bean public JobDetailFactoryBean jobDetail() { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); factoryBean.setJobClass(); factoryBean.setDurability(true); return factoryBean; } @Bean public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) { SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean(); factoryBean.setJobDetail(jobDetail); factoryBean.setRepeatInterval(10000); // 每10秒执行一次 factoryBean.setRepeatCount(SimpleTrigger.REPEAT_IDEFIITELY); factoryBean.setStartDelay(0); factoryBean.setMisfireInstruction(SimpleScheduleBuilder.MISFIRE_ISTRUCTIO_FIRE_OW); return factoryBean; } }5. 启动Spring Boot应用最后 | |
本站网友 回龙观租房网 | 12分钟前 发表 |
通常位于Quartz的发行包中 | |
本站网友 什么叫车震 | 17分钟前 发表 |
mysql | |
本站网友 天极图片 | 5分钟前 发表 |
mysql | |
本站网友 浴室装修图片 | 25分钟前 发表 |
参考资料Quartz 官方文档Spring Boot 官方文档Spring Quartz 是一个非常流行的调度框架 | |
本站网友 拍拍贷网 | 16分钟前 发表 |
在单机环境中 | |
本站网友 武汉商铺 | 26分钟前 发表 |
//localhost | |
本站网友 金霞二手房 | 8分钟前 发表 |
//localhost | |
本站网友 facebook总裁 | 15分钟前 发表 |
将脚本中的 SQL 语句执行到 MySQL 数据库中:代码语言:javascript代码运行次数:0运行复制-- 示例:创建 Quartz 表 CREATE TABLE QRTZ_JOB_DETAILS( SCHED_AME VARCHAR(120) OT ULL | |
本站网友 福彩七乐彩 | 25分钟前 发表 |
//localhost | |
本站网友 更上一层楼 | 27分钟前 发表 |
使用以下命令创建表:代码语言:javascript代码运行次数:0运行复制CREATE DATABASE quartz_db; USE quartz_db; -- 运行Quartz提供的SQL脚本 SOURCE path/to/tables_mysql_innodb.sql;7. 测试启动多个实例(每个实例运行在不同的端口上) |