在Spring框架下配置Quartz集群的詳細步驟(MySQL數(shù)據(jù)源)
簡介
Quartz 是一個功能強大的調度庫,可以在 Java 應用中用于執(zhí)行定時任務。在單機環(huán)境中,Quartz 的配置和使用相對簡單,但在分布式系統(tǒng)中,為了確保任務的唯一性和高可用性,通常需要將 Quartz 配置為集群模式。本文將介紹如何在 Spring 框架下配置 Quartz 集群,并使用 MySQL 作為數(shù)據(jù)源來存儲調度信息。
環(huán)境準備
- Java 版本: 1.8 或更高
- Spring Boot 版本: 2.3.x
- Quartz 版本: 2.3.x
- 數(shù)據(jù)庫: 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>步驟二:配置數(shù)據(jù)庫
在 ??application.properties?? 中配置數(shù)據(jù)庫連接:
spring.datasource.url=jdbc:mysql://localhost:3306/quartz?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
步驟三:創(chuàng)建 Quartz 表
Quartz 需要一些特定的表來存儲調度信息??梢允褂?Quartz 提供的 SQL 腳本來創(chuàng)建這些表。對于 MySQL,可以使用 ??tables_mysql_innodb.sql?? 腳本。
將腳本中的 SQL 語句執(zhí)行到 MySQL 數(shù)據(jù)庫中:
-- 示例:創(chuàng)建 Quartz 表 CREATE TABLE QRTZ_JOB_DETAILS( SCHED_NAME VARCHAR(120) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE VARCHAR(1) NOT NULL, IS_NONCONCURRENT VARCHAR(1) NOT NULL, IS_UPDATE_DATA VARCHAR(1) NOT NULL, REQUESTS_RECOVERY VARCHAR(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) ) ENGINE=InnoDB; -- 其他表創(chuàng)建語句...
步驟四:配置 Quartz 集群
在 ??application.properties?? 中配置 Quartz 以啟用集群模式:
# Quartz 配置 spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.scheduler.instanceName=ClusteredScheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000 spring.quartz.properties.org.quartz.jobStore.misfireThreshold=60000 spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
步驟五:創(chuàng)建任務
定義一個簡單的 Quartz 任務類:
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 {
System.out.println("SimpleJob is running...");
}
}步驟六:配置任務調度
在 Spring 配置類中配置任務調度:
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.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(SimpleJob.class);
factoryBean.setDurability(true);
return factoryBean;
}
@Bean
public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setRepeatInterval(10000); // 每10秒執(zhí)行一次
factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
factoryBean.setStartDelay(0L);
factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);
return factoryBean;
}
}步驟七:啟動應用
啟動 Spring Boot 應用程序,Quartz 將自動在集群模式下運行,并且所有節(jié)點都會共享相同的調度信息。
Spring Quartz 是一個非常流行的調度框架,用于在Java應用程序中執(zhí)行定時任務。當使用Quartz與Spring框架結合時,可以通過配置MySQL作為數(shù)據(jù)源來實現(xiàn)集群化部署,從而確保高可用性和負載均衡。
下面是一個簡單的示例,展示如何在Spring Boot項目中配置和使用Spring Quartz集群(使用MySQL作為數(shù)據(jù)源):
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數(shù)據(jù)源
在??application.properties??或??application.yml??中配置MySQL數(shù)據(jù)源和Quartz的相關屬性:
# 數(shù)據(jù)源配置 spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # HikariCP連接池配置 spring.datasource.hikari.pool-name=HikariCP spring.datasource.hikari.maximum-pool-size=10 # Quartz配置 spring.quartz.job-store-type=jdbc spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000 spring.quartz.properties.org.quartz.scheduler.instanceName=ClusteredScheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
3. 創(chuàng)建Quartz Job
創(chuàng)建一個簡單的Quartz Job類,該類實現(xiàn)了??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(MyJob.class);
@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:
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.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(MyJob.class);
factoryBean.setDurability(true);
return factoryBean;
}
@Bean
public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setRepeatInterval(10000); // 每10秒執(zhí)行一次
factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
factoryBean.setStartDelay(0);
factoryBean.setMisfireInstruction(SimpleScheduleBuilder.MISFIRE_INSTRUCTION_FIRE_NOW);
return factoryBean;
}
}5. 啟動Spring Boot應用
最后,創(chuàng)建一個Spring Boot啟動類:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QuartzClusterApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzClusterApplication.class, args);
}
}6. 初始化Quartz表
確保在MySQL數(shù)據(jù)庫中創(chuàng)建Quartz所需的表。可以使用Quartz提供的SQL腳本,通常位于Quartz的發(fā)行包中,或者從Quartz的GitHub倉庫下載。
例如,使用以下命令創(chuàng)建表:
CREATE DATABASE quartz_db; USE quartz_db; -- 運行Quartz提供的SQL腳本 SOURCE path/to/tables_mysql_innodb.sql;
7. 測試
啟動多個實例(每個實例運行在不同的端口上),觀察日志輸出,確保任務在集群中的不同節(jié)點上交替執(zhí)行。
以上就是一個完整的Spring Boot + Quartz + MySQL集群配置示例。希望對你有所幫助!如果有任何問題或需要進一步的幫助,請隨時告訴我。在使用Spring與Quartz結合構建定時任務的集群環(huán)境中,MySQL通常被用作持久化存儲來確保任務的調度信息能夠在集群中的不同節(jié)點間共享。這樣可以避免同一個任務在多個節(jié)點上重復執(zhí)行,并且能夠保證即使某個節(jié)點宕機,其他節(jié)點也能接管未完成的任務。
以下是一個詳細的步驟和示例代碼,介紹如何在Spring Boot項目中配置和使用Quartz集群(MySQL數(shù)據(jù)源):
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數(shù)據(jù)庫:
# MySQL 數(shù)據(jù)庫配置 spring.datasource.url=jdbc:mysql://localhost:3306/quartz?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Quartz 配置 spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.scheduler.instanceName=ClusteredScheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000 spring.quartz.properties.org.quartz.jobStore.misfireThreshold=60000 spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartz.threadPool.threadCount=10
3. 創(chuàng)建定時任務
創(chuàng)建一個簡單的定時任務類:
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 {
System.out.println("MyJob is running on node " + context.getScheduler().getSchedulerInstanceId());
}
}4. 配置Spring Boot啟動類
在Spring Boot的啟動類中配置Quartz Scheduler:
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.springframework.context.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.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail myJobDetail() {
return JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
}
@Bean
public Trigger myJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(myJobDetail())
.withIdentity("myJobTrigger", "group1")
.withSchedule(scheduleBuilder)
.build();
}
}6. 啟動應用
啟動Spring Boot應用后,Quartz會根據(jù)配置自動創(chuàng)建并調度任務。由于配置了集群模式,多個節(jié)點上的應用會共享相同的任務調度信息,確保任務不會重復執(zhí)行。
注意事項
- 數(shù)據(jù)庫表結構:確保MySQL數(shù)據(jù)庫中有Quartz所需的表結構??梢酝ㄟ^設置?
?spring.quartz.jdbc.initialize-schema=always??來自動生成這些表。 - 集群配置:確保每個節(jié)點的?
?instanceId??是唯一的,可以通過設置??AUTO??來自動生成。 - 時間同步:確保集群中的所有節(jié)點的時間同步,以避免因時間不一致導致的任務調度問題。
通過以上步驟,你可以在Spring Boot項目中成功配置和使用Quartz集群(MySQL數(shù)據(jù)源)。
以上就是在Spring框架下配置Quartz集群的詳細步驟的詳細內容,更多關于Spring配置Quartz集群的資料請關注腳本之家其它相關文章!
相關文章
淺談Java中ThreadLocal內存泄露的原因及處理方式
內存泄漏就是我們申請了內存,但是該內存一直無法釋放,就會導致內存溢出問題,本文詳細的介紹了ThreadLocal內存泄露的原因及處理方式,感興趣的可以了解一下2023-05-05
jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問題
這篇文章主要介紹了jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問題,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-02-02
JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
springboot 整合druid數(shù)據(jù)庫密碼加密功能的實現(xiàn)代碼
這篇文章主要介紹了springboot 整合druid數(shù)據(jù)庫密碼加密功能的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

