1.SpringBoot整合Quartz使用內(nèi)存持久化
1.1.什么是內(nèi)存持久化
Quartz的內(nèi)存持久化是指Quartz框架在默認情況下將任務(wù)調(diào)度的運行信息保存在內(nèi)存中。這種方式的優(yōu)點是可以提供最佳的性能,因為內(nèi)存中數(shù)據(jù)訪問最快。然而,內(nèi)存持久化的缺點是缺乏數(shù)據(jù)的持久性。當(dāng)程序停止或系統(tǒng)崩潰時,所有運行的信息都會丟失。
1.2.步驟如下
1.2.1. 添加依賴
首先,在pom.xml文件中添加Quartz的依賴項。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
?
1.2.2. 創(chuàng)建Job類
實現(xiàn)org.quartz.Job接口或org.quartz.StatefulJob接口,并覆蓋execute方法。
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 {
// 執(zhí)行作業(yè)邏輯
}
}
1.2.3. 創(chuàng)建JobDetail和Trigger
使用JobBuilder和TriggerBuilder來創(chuàng)建JobDetail和Trigger實例,并通過調(diào)度器將它們關(guān)聯(lián)起來。
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
//創(chuàng)建JobDetailr實例
@Bean
public JobDetail myJobDetail() {
return JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.storeDurably()
.build();
}
//創(chuàng)建調(diào)度器和Trigge并管理jobDetail
@Bean
public Trigger myTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5) //每5秒執(zhí)行一次任務(wù)
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(myJobDetail())
.withIdentity("myTrigger", "group1")
.withSchedule(scheduleBuilder)
.build();
}
}
1.2.4. 啟動應(yīng)用
運行你的Spring Boot應(yīng)用,Quartz將會根據(jù)配置自動啟動,并按照你定義的Trigger來觸發(fā)并執(zhí)行作業(yè)。
1.2.實例
定時執(zhí)行任務(wù),查找數(shù)據(jù)庫中預(yù)約時間過期的數(shù)據(jù)并將車位狀態(tài)實時更新。
1.2.1數(shù)據(jù)庫數(shù)據(jù)說明
預(yù)約記錄表單
車位表單中的id作為預(yù)約表單的外鍵
1.2.2.關(guān)鍵代碼
對job類進行修改
package com.duhong.quartz;
import com.duhong.entity.OrderParking;
import com.duhong.service.OrderService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.batch.BatchProperties;
import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class UpdateJob implements Job {
@Autowired
OrderService orderService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//查詢所有預(yù)約記錄
List<OrderParking> orderParkings = orderService.selectRecord();
for (OrderParking orderParking : orderParkings) {
System.out.println("作業(yè)執(zhí)行");
System.out.println("到期時間"+orderParking.getDeadtime());
System.out.println("當(dāng)前時間"+LocalDateTime.now());
//未到預(yù)約時間
if(orderParking.getDeadtime().isBefore( LocalDateTime.now())){
//更新車位狀態(tài)
orderService.updateInitStatus(orderParking.getId());
System.out.println("更新成功");
}else{
System.out.println("未到預(yù)約時間");
}
}
}
}
1.2.3.執(zhí)行結(jié)果
2.SpringBoot整合Quartz使用mysql持久化
2.1.為啥要使用數(shù)據(jù)庫持久化
Quartz 是一個開源的任務(wù)調(diào)度框架,用于在 Java 應(yīng)用中執(zhí)行定時任務(wù)。Quartz 本身不直接提供任務(wù)持久化的功能,但它支持將任務(wù)、觸發(fā)器和其他相關(guān)信息存儲到數(shù)據(jù)庫中,以便在應(yīng)用程序重啟或服務(wù)器崩潰后恢復(fù)。
選擇 MySQL 作為 Quartz 的持久化存儲有以下幾個原因:
- 通用性和普及性:MySQL 是一個廣泛使用的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),具有很高的通用性和普及性。很多開發(fā)者和團隊都熟悉 MySQL,因此選擇 MySQL 作為 Quartz 的持久化存儲可以簡化開發(fā)和維護過程。
- 穩(wěn)定性和可靠性:MySQL 是一個成熟、穩(wěn)定且經(jīng)過廣泛驗證的數(shù)據(jù)庫系統(tǒng)。它提供了良好的數(shù)據(jù)完整性和可靠性保證,可以確保 Quartz 任務(wù)調(diào)度的準確性和一致性。
- 性能優(yōu)化:MySQL 在處理大量數(shù)據(jù)和復(fù)雜查詢方面表現(xiàn)出色。通過合理的索引和查詢優(yōu)化,可以確保 Quartz 在持久化任務(wù)時具有良好的性能表現(xiàn)。
- 社區(qū)支持和資源:由于 MySQL 的廣泛使用和開源性質(zhì),它擁有龐大的用戶社區(qū)和豐富的資源。這意味著在遇到問題時,可以更容易地找到解決方案或獲得幫助。
- 擴展性和靈活性:MySQL 支持多種存儲引擎和配置選項,可以根據(jù)實際需求進行靈活的配置和擴展。這使得它成為一個適合各種規(guī)模應(yīng)用程序的持久化存儲選擇。
2.2.持久化步驟
基于對quartz使用內(nèi)存持久化,我們只需添加數(shù)據(jù)庫表及修改properities文件即可文章來源:http://www.zghlxwxcb.cn/news/detail-831972.html
2.2.1.添加數(shù)據(jù)庫表
create table if not exists parking_place
(
id int auto_increment
primary key,
location varchar(255) null,
status int default 0 null,
price double null,
type varchar(255) null
);
create table if not exists qrtz_calendars
(
SCHED_NAME varchar(120) not null,
CALENDAR_NAME varchar(190) not null,
CALENDAR blob not null,
primary key (SCHED_NAME, CALENDAR_NAME)
);
create table if not exists qrtz_fired_triggers
(
SCHED_NAME varchar(120) not null,
ENTRY_ID varchar(95) not null,
TRIGGER_NAME varchar(190) not null,
TRIGGER_GROUP varchar(190) not null,
INSTANCE_NAME varchar(190) not null,
FIRED_TIME bigint(13) not null,
SCHED_TIME bigint(13) not null,
PRIORITY int not null,
STATE varchar(16) not null,
JOB_NAME varchar(190) null,
JOB_GROUP varchar(190) null,
IS_NONCONCURRENT varchar(1) null,
REQUESTS_RECOVERY varchar(1) null,
primary key (SCHED_NAME, ENTRY_ID)
);
create index IDX_QRTZ_FT_INST_JOB_REQ_RCVRY
on qrtz_fired_triggers (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
create index IDX_QRTZ_FT_JG
on qrtz_fired_triggers (SCHED_NAME, JOB_GROUP);
create index IDX_QRTZ_FT_J_G
on qrtz_fired_triggers (SCHED_NAME, JOB_NAME, JOB_GROUP);
create index IDX_QRTZ_FT_TG
on qrtz_fired_triggers (SCHED_NAME, TRIGGER_GROUP);
create index IDX_QRTZ_FT_TRIG_INST_NAME
on qrtz_fired_triggers (SCHED_NAME, INSTANCE_NAME);
create index IDX_QRTZ_FT_T_G
on qrtz_fired_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
create table if not exists qrtz_job_details
(
SCHED_NAME varchar(120) not null,
JOB_NAME varchar(190) not null,
JOB_GROUP varchar(190) 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)
);
create index IDX_QRTZ_J_GRP
on qrtz_job_details (SCHED_NAME, JOB_GROUP);
create index IDX_QRTZ_J_REQ_RECOVERY
on qrtz_job_details (SCHED_NAME, REQUESTS_RECOVERY);
create table if not exists qrtz_locks
(
SCHED_NAME varchar(120) not null,
LOCK_NAME varchar(40) not null,
primary key (SCHED_NAME, LOCK_NAME)
);
create table if not exists qrtz_paused_trigger_grps
(
SCHED_NAME varchar(120) not null,
TRIGGER_GROUP varchar(190) not null,
primary key (SCHED_NAME, TRIGGER_GROUP)
);
create table if not exists qrtz_scheduler_state
(
SCHED_NAME varchar(120) not null,
INSTANCE_NAME varchar(190) not null,
LAST_CHECKIN_TIME bigint(13) not null,
CHECKIN_INTERVAL bigint(13) not null,
primary key (SCHED_NAME, INSTANCE_NAME)
);
create table if not exists qrtz_triggers
(
SCHED_NAME varchar(120) not null,
TRIGGER_NAME varchar(190) not null,
TRIGGER_GROUP varchar(190) not null,
JOB_NAME varchar(190) not null,
JOB_GROUP varchar(190) not null,
DESCRIPTION varchar(250) null,
NEXT_FIRE_TIME bigint(13) null,
PREV_FIRE_TIME bigint(13) null,
PRIORITY int null,
TRIGGER_STATE varchar(16) not null,
TRIGGER_TYPE varchar(8) not null,
START_TIME bigint(13) not null,
END_TIME bigint(13) null,
CALENDAR_NAME varchar(190) null,
MISFIRE_INSTR smallint(2) null,
JOB_DATA blob null,
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_triggers_ibfk_1
foreign key (SCHED_NAME, JOB_NAME, JOB_GROUP) references qrtz_job_details (SCHED_NAME, JOB_NAME, JOB_GROUP)
);
create table if not exists qrtz_blob_triggers
(
SCHED_NAME varchar(120) not null,
TRIGGER_NAME varchar(190) not null,
TRIGGER_GROUP varchar(190) not null,
BLOB_DATA blob null,
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_blob_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
create index SCHED_NAME
on qrtz_blob_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
create table if not exists qrtz_cron_triggers
(
SCHED_NAME varchar(120) not null,
TRIGGER_NAME varchar(190) not null,
TRIGGER_GROUP varchar(190) not null,
CRON_EXPRESSION varchar(120) not null,
TIME_ZONE_ID varchar(80) null,
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_cron_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
create table if not exists qrtz_simple_triggers
(
SCHED_NAME varchar(120) not null,
TRIGGER_NAME varchar(190) not null,
TRIGGER_GROUP varchar(190) not null,
REPEAT_COUNT bigint(7) not null,
REPEAT_INTERVAL bigint(12) not null,
TIMES_TRIGGERED bigint(10) not null,
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_simple_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
create table if not exists qrtz_simprop_triggers
(
SCHED_NAME varchar(120) not null,
TRIGGER_NAME varchar(190) not null,
TRIGGER_GROUP varchar(190) not null,
STR_PROP_1 varchar(512) null,
STR_PROP_2 varchar(512) null,
STR_PROP_3 varchar(512) null,
INT_PROP_1 int null,
INT_PROP_2 int null,
LONG_PROP_1 bigint null,
LONG_PROP_2 bigint null,
DEC_PROP_1 decimal(13,4) null,
DEC_PROP_2 decimal(13,4) null,
BOOL_PROP_1 varchar(1) null,
BOOL_PROP_2 varchar(1) null,
primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
constraint qrtz_simprop_triggers_ibfk_1
foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
create index IDX_QRTZ_T_C
on qrtz_triggers (SCHED_NAME, CALENDAR_NAME);
create index IDX_QRTZ_T_G
on qrtz_triggers (SCHED_NAME, TRIGGER_GROUP);
create index IDX_QRTZ_T_J
on qrtz_triggers (SCHED_NAME, JOB_NAME, JOB_GROUP);
create index IDX_QRTZ_T_JG
on qrtz_triggers (SCHED_NAME, JOB_GROUP);
create index IDX_QRTZ_T_NEXT_FIRE_TIME
on qrtz_triggers (SCHED_NAME, NEXT_FIRE_TIME);
create index IDX_QRTZ_T_NFT_MISFIRE
on qrtz_triggers (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME);
create index IDX_QRTZ_T_NFT_ST
on qrtz_triggers (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME);
create index IDX_QRTZ_T_NFT_ST_MISFIRE
on qrtz_triggers (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);
create index IDX_QRTZ_T_NFT_ST_MISFIRE_GRP
on qrtz_triggers (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);
create index IDX_QRTZ_T_N_G_STATE
on qrtz_triggers (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE);
create index IDX_QRTZ_T_N_STATE
on qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE);
create index IDX_QRTZ_T_STATE
on qrtz_triggers (SCHED_NAME, TRIGGER_STATE);
2.2.2.持久化配置
quartz:
# 將任務(wù)等保存化到數(shù)據(jù)庫
job-store-type: jdbc
# 程序結(jié)束時會等待quartz相關(guān)的內(nèi)容結(jié)束
wait-for-jobs-to-complete-on-shutdown: true
overwrite-existing-jobs: true
properties:
org:
quartz:
scheduler:
# scheduler的實例名
instanceName: scheduler
#auto:自動生成唯一值
instanceId: AUTO
# 持久化相關(guān)
jobStore:
# 升級 springboot 版本,注釋 class 屬性
# class: org.quartz.impl.jdbcjobstore.JobStoreTX
# 數(shù)據(jù)庫類型
driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
# 表示數(shù)據(jù)庫表名前綴
tablePrefix: QRTZ_
useProperties: false
# 線程池相關(guān)
threadPool:
class: org.quartz.simpl.SimpleThreadPool
# 線程數(shù)
threadCount: 10
# 線程優(yōu)先級
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
2.2.3.重啟實例,持久化成功
文章來源地址http://www.zghlxwxcb.cn/news/detail-831972.html
到了這里,關(guān)于Quartz---Springboot項目整合Quartz---實現(xiàn)內(nèi)存、數(shù)據(jù)庫持久化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!