在Spring框架下配置Quartz集群的詳細(xì)步驟(MySQL數(shù)據(jù)源)
簡(jiǎn)介
Quartz 是一個(gè)功能強(qiáng)大的調(diào)度庫(kù),可以在 Java 應(yīng)用中用于執(zhí)行定時(shí)任務(wù)。在單機(jī)環(huán)境中,Quartz 的配置和使用相對(duì)簡(jiǎn)單,但在分布式系統(tǒng)中,為了確保任務(wù)的唯一性和高可用性,通常需要將 Quartz 配置為集群模式。本文將介紹如何在 Spring 框架下配置 Quartz 集群,并使用 MySQL 作為數(shù)據(jù)源來存儲(chǔ)調(diào)度信息。
環(huán)境準(zhǔn)備
- Java 版本: 1.8 或更高
- Spring Boot 版本: 2.3.x
- Quartz 版本: 2.3.x
- 數(shù)據(jù)庫(kù): 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ù)庫(kù)
在 ??application.properties?? 中配置數(shù)據(jù)庫(kù)連接:
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 需要一些特定的表來存儲(chǔ)調(diào)度信息。可以使用 Quartz 提供的 SQL 腳本來創(chuàng)建這些表。對(duì)于 MySQL,可以使用 ??tables_mysql_innodb.sql?? 腳本。
將腳本中的 SQL 語(yǔ)句執(zhí)行到 MySQL 數(shù)據(jù)庫(kù)中:
-- 示例:創(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)建語(yǔ)句...
步驟四:配置 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)建任務(wù)
定義一個(gè)簡(jiǎn)單的 Quartz 任務(wù)類:
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...");
}
}步驟六:配置任務(wù)調(diào)度
在 Spring 配置類中配置任務(wù)調(diào)度:
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;
}
}步驟七:?jiǎn)?dòng)應(yīng)用
啟動(dòng) Spring Boot 應(yīng)用程序,Quartz 將自動(dòng)在集群模式下運(yùn)行,并且所有節(jié)點(diǎn)都會(huì)共享相同的調(diào)度信息。
Spring Quartz 是一個(gè)非常流行的調(diào)度框架,用于在Java應(yīng)用程序中執(zhí)行定時(shí)任務(wù)。當(dāng)使用Quartz與Spring框架結(jié)合時(shí),可以通過配置MySQL作為數(shù)據(jù)源來實(shí)現(xiàn)集群化部署,從而確保高可用性和負(fù)載均衡。
下面是一個(gè)簡(jiǎn)單的示例,展示如何在Spring Boot項(xiàng)目中配置和使用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的相關(guān)屬性:
# 數(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)建一個(gè)簡(jiǎn)單的Quartz Job類,該類實(shí)現(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. 啟動(dòng)Spring Boot應(yīng)用
最后,創(chuàng)建一個(gè)Spring Boot啟動(dòng)類:
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ù)庫(kù)中創(chuàng)建Quartz所需的表。可以使用Quartz提供的SQL腳本,通常位于Quartz的發(fā)行包中,或者從Quartz的GitHub倉(cāng)庫(kù)下載。
例如,使用以下命令創(chuàng)建表:
CREATE DATABASE quartz_db; USE quartz_db; -- 運(yùn)行Quartz提供的SQL腳本 SOURCE path/to/tables_mysql_innodb.sql;
7. 測(cè)試
啟動(dòng)多個(gè)實(shí)例(每個(gè)實(shí)例運(yùn)行在不同的端口上),觀察日志輸出,確保任務(wù)在集群中的不同節(jié)點(diǎn)上交替執(zhí)行。
以上就是一個(gè)完整的Spring Boot + Quartz + MySQL集群配置示例。希望對(duì)你有所幫助!如果有任何問題或需要進(jìn)一步的幫助,請(qǐng)隨時(shí)告訴我。在使用Spring與Quartz結(jié)合構(gòu)建定時(shí)任務(wù)的集群環(huán)境中,MySQL通常被用作持久化存儲(chǔ)來確保任務(wù)的調(diào)度信息能夠在集群中的不同節(jié)點(diǎn)間共享。這樣可以避免同一個(gè)任務(wù)在多個(gè)節(jié)點(diǎn)上重復(fù)執(zhí)行,并且能夠保證即使某個(gè)節(jié)點(diǎn)宕機(jī),其他節(jié)點(diǎn)也能接管未完成的任務(wù)。
以下是一個(gè)詳細(xì)的步驟和示例代碼,介紹如何在Spring Boot項(xiàng)目中配置和使用Quartz集群(MySQL數(shù)據(jù)源):
1. 添加依賴
首先,在??pom.xml??文件中添加Spring Boot和Quartz的相關(guān)依賴:
<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ù)庫(kù):
# MySQL 數(shù)據(jù)庫(kù)配置 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)建定時(shí)任務(wù)
創(chuàng)建一個(gè)簡(jiǎn)單的定時(shí)任務(wù)類:
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啟動(dòng)類
在Spring Boot的啟動(dòng)類中配置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. 啟動(dòng)應(yīng)用
啟動(dòng)Spring Boot應(yīng)用后,Quartz會(huì)根據(jù)配置自動(dòng)創(chuàng)建并調(diào)度任務(wù)。由于配置了集群模式,多個(gè)節(jié)點(diǎn)上的應(yīng)用會(huì)共享相同的任務(wù)調(diào)度信息,確保任務(wù)不會(huì)重復(fù)執(zhí)行。
注意事項(xiàng)
- 數(shù)據(jù)庫(kù)表結(jié)構(gòu):確保MySQL數(shù)據(jù)庫(kù)中有Quartz所需的表結(jié)構(gòu)??梢酝ㄟ^設(shè)置?
?spring.quartz.jdbc.initialize-schema=always??來自動(dòng)生成這些表。 - 集群配置:確保每個(gè)節(jié)點(diǎn)的?
?instanceId??是唯一的,可以通過設(shè)置??AUTO??來自動(dòng)生成。 - 時(shí)間同步:確保集群中的所有節(jié)點(diǎn)的時(shí)間同步,以避免因時(shí)間不一致導(dǎo)致的任務(wù)調(diào)度問題。
通過以上步驟,你可以在Spring Boot項(xiàng)目中成功配置和使用Quartz集群(MySQL數(shù)據(jù)源)。
以上就是在Spring框架下配置Quartz集群的詳細(xì)步驟的詳細(xì)內(nèi)容,更多關(guān)于Spring配置Quartz集群的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java?Servlet實(shí)現(xiàn)表白墻的代碼實(shí)例
最近用Servlet做了個(gè)小項(xiàng)目,分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java?Servlet實(shí)現(xiàn)表白墻的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
淺談Java中ThreadLocal內(nèi)存泄露的原因及處理方式
內(nèi)存泄漏就是我們申請(qǐng)了內(nèi)存,但是該內(nèi)存一直無法釋放,就會(huì)導(dǎo)致內(nèi)存溢出問題,本文詳細(xì)的介紹了ThreadLocal內(nèi)存泄露的原因及處理方式,感興趣的可以了解一下2023-05-05
jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問題
這篇文章主要介紹了jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問題,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02
Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展史
這篇文章主要介紹了Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展簡(jiǎn)史,Java源自Sun公司的一個(gè)叫Green的項(xiàng)目,其原先的目的是為家用電子消費(fèi)產(chǎn)品開發(fā)一個(gè)分布式代碼系統(tǒng),這樣就可以將通信和控制信息發(fā)給電冰箱、電視機(jī)、烤面包機(jī)等家用電器,對(duì)它們進(jìn)行控制和信息交流,需要的朋友可以參考一下2022-01-01
JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
詳解用Eclipse如何創(chuàng)建Web項(xiàng)目
本篇文章主要介紹了詳解用Eclipse如何創(chuàng)建Web項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
springboot 整合druid數(shù)據(jù)庫(kù)密碼加密功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot 整合druid數(shù)據(jù)庫(kù)密碼加密功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

