在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ù)源來(lái)存儲(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 需要一些特定的表來(lái)存儲(chǔ)調(diào)度信息??梢允褂?Quartz 提供的 SQL 腳本來(lái)創(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í),可以通過(guò)配置MySQL作為數(shù)據(jù)源來(lái)實(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所需的表??梢允褂肣uartz提供的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ì)你有所幫助!如果有任何問(wèn)題或需要進(jìn)一步的幫助,請(qǐng)隨時(shí)告訴我。在使用Spring與Quartz結(jié)合構(gòu)建定時(shí)任務(wù)的集群環(huán)境中,MySQL通常被用作持久化存儲(chǔ)來(lái)確保任務(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?
?類來(lái)定義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)??梢酝ㄟ^(guò)設(shè)置?
?spring.quartz.jdbc.initialize-schema=always?
?來(lái)自動(dòng)生成這些表。 - 集群配置:確保每個(gè)節(jié)點(diǎn)的?
?instanceId?
?是唯一的,可以通過(guò)設(shè)置??AUTO?
?來(lái)自動(dòng)生成。 - 時(shí)間同步:確保集群中的所有節(jié)點(diǎn)的時(shí)間同步,以避免因時(shí)間不一致導(dǎo)致的任務(wù)調(diào)度問(wèn)題。
通過(guò)以上步驟,你可以在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)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02淺談Java中ThreadLocal內(nèi)存泄露的原因及處理方式
內(nèi)存泄漏就是我們申請(qǐng)了內(nèi)存,但是該內(nèi)存一直無(wú)法釋放,就會(huì)導(dǎo)致內(nèi)存溢出問(wèn)題,本文詳細(xì)的介紹了ThreadLocal內(nèi)存泄露的原因及處理方式,感興趣的可以了解一下2023-05-05jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問(wèn)題
這篇文章主要介紹了jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問(wèn)題,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展史
這篇文章主要介紹了Java基礎(chǔ)-Java編程語(yǔ)言發(fā)展簡(jiǎn)史,Java源自Sun公司的一個(gè)叫Green的項(xiàng)目,其原先的目的是為家用電子消費(fèi)產(chǎn)品開(kāi)發(fā)一個(gè)分布式代碼系統(tǒng),這樣就可以將通信和控制信息發(fā)給電冰箱、電視機(jī)、烤面包機(jī)等家用電器,對(duì)它們進(jìn)行控制和信息交流,需要的朋友可以參考一下2022-01-01JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08詳解用Eclipse如何創(chuàng)建Web項(xiàng)目
本篇文章主要介紹了詳解用Eclipse如何創(chuàng)建Web項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12springboot 整合druid數(shù)據(jù)庫(kù)密碼加密功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot 整合druid數(shù)據(jù)庫(kù)密碼加密功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01