在Spring框架下配置Quartz集群的詳細(xì)步驟(MySQL數(shù)據(jù)源)
簡介
Quartz 是一個(gè)功能強(qiáng)大的調(diào)度庫,可以在 Java 應(yīng)用中用于執(zhí)行定時(shí)任務(wù)。在單機(jī)環(huán)境中,Quartz 的配置和使用相對簡單,但在分布式系統(tǒng)中,為了確保任務(wù)的唯一性和高可用性,通常需要將 Quartz 配置為集群模式。本文將介紹如何在 Spring 框架下配置 Quartz 集群,并使用 MySQL 作為數(shù)據(jù)源來存儲調(diào)度信息。
環(huán)境準(zhǔ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 需要一些特定的表來存儲調(diào)度信息??梢允褂?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)建任務(wù)
定義一個(gè)簡單的 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; } }
步驟七:啟動應(yīng)用
啟動 Spring Boot 應(yīng)用程序,Quartz 將自動在集群模式下運(yùn)行,并且所有節(jié)點(diǎn)都會共享相同的調(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è)簡單的示例,展示如何在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è)簡單的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. 啟動Spring Boot應(yīng)用
最后,創(chuàng)建一個(gè)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所需的表??梢允褂肣uartz提供的SQL腳本,通常位于Quartz的發(fā)行包中,或者從Quartz的GitHub倉庫下載。
例如,使用以下命令創(chuàng)建表:
CREATE DATABASE quartz_db; USE quartz_db; -- 運(yùn)行Quartz提供的SQL腳本 SOURCE path/to/tables_mysql_innodb.sql;
7. 測試
啟動多個(gè)實(shí)例(每個(gè)實(shí)例運(yùn)行在不同的端口上),觀察日志輸出,確保任務(wù)在集群中的不同節(jié)點(diǎn)上交替執(zhí)行。
以上就是一個(gè)完整的Spring Boot + Quartz + MySQL集群配置示例。希望對你有所幫助!如果有任何問題或需要進(jìn)一步的幫助,請隨時(shí)告訴我。在使用Spring與Quartz結(jié)合構(gòu)建定時(shí)任務(wù)的集群環(huán)境中,MySQL通常被用作持久化存儲來確保任務(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ù)庫:
# 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)建定時(shí)任務(wù)
創(chuàng)建一個(gè)簡單的定時(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啟動類
在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. 啟動應(yīng)用
啟動Spring Boot應(yīng)用后,Quartz會根據(jù)配置自動創(chuàng)建并調(diào)度任務(wù)。由于配置了集群模式,多個(gè)節(jié)點(diǎn)上的應(yīng)用會共享相同的任務(wù)調(diào)度信息,確保任務(wù)不會重復(fù)執(zhí)行。
注意事項(xiàng)
- 數(shù)據(jù)庫表結(jié)構(gòu):確保MySQL數(shù)據(jù)庫中有Quartz所需的表結(jié)構(gòu)??梢酝ㄟ^設(shè)置?
?spring.quartz.jdbc.initialize-schema=always?
?來自動生成這些表。 - 集群配置:確保每個(gè)節(jié)點(diǎn)的?
?instanceId?
?是唯一的,可以通過設(shè)置??AUTO?
?來自動生成。 - 時(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集群的資料請關(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)存泄漏就是我們申請了內(nèi)存,但是該內(nèi)存一直無法釋放,就會導(dǎo)致內(nèi)存溢出問題,本文詳細(xì)的介紹了ThreadLocal內(nèi)存泄露的原因及處理方式,感興趣的可以了解一下2023-05-05jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問題
這篇文章主要介紹了jackson使用@JsonSerialize格式化BigDecimal解決.00不顯示問題,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02JVM優(yōu)先級線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(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-12springboot 整合druid數(shù)據(jù)庫密碼加密功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot 整合druid數(shù)據(jù)庫密碼加密功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01