mirror of https://github.com/elunez/eladmin
feat: quartz 分布式支持,默认单机运行,如果需要支持分布式可以查看 application-quartz.yml 注释
parent
3e65992255
commit
0494f6ad17
|
@ -45,6 +45,12 @@
|
||||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- quartz -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-quartz</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- jwt -->
|
<!-- jwt -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.jsonwebtoken</groupId>
|
<groupId>io.jsonwebtoken</groupId>
|
||||||
|
@ -62,12 +68,6 @@
|
||||||
<version>${jjwt.version}</version>
|
<version>${jjwt.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- quartz -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.quartz-scheduler</groupId>
|
|
||||||
<artifactId>quartz</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- linux的管理 -->
|
<!-- linux的管理 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.ethz.ganymed</groupId>
|
<groupId>ch.ethz.ganymed</groupId>
|
||||||
|
|
|
@ -15,9 +15,13 @@
|
||||||
*/
|
*/
|
||||||
package me.zhengjie.modules.quartz.config;
|
package me.zhengjie.modules.quartz.config;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.quartz.spi.TriggerFiredBundle;
|
import org.quartz.spi.TriggerFiredBundle;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
|
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.lang.NonNull;
|
||||||
import org.springframework.scheduling.quartz.AdaptableJobFactory;
|
import org.springframework.scheduling.quartz.AdaptableJobFactory;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@ -26,7 +30,9 @@ import org.springframework.stereotype.Component;
|
||||||
* @author /
|
* @author /
|
||||||
* @date 2019-01-07
|
* @date 2019-01-07
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Configuration
|
@Configuration
|
||||||
|
@Scope("singleton")
|
||||||
public class QuartzConfig {
|
public class QuartzConfig {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,16 +43,24 @@ public class QuartzConfig {
|
||||||
|
|
||||||
private final AutowireCapableBeanFactory capableBeanFactory;
|
private final AutowireCapableBeanFactory capableBeanFactory;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
|
public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
|
||||||
this.capableBeanFactory = capableBeanFactory;
|
this.capableBeanFactory = capableBeanFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
|
protected Object createJobInstance(@NonNull TriggerFiredBundle bundle) throws Exception {
|
||||||
//调用父类的方法,把Job注入到spring中
|
try {
|
||||||
Object jobInstance = super.createJobInstance(bundle);
|
// 调用父类的方法,把Job注入到spring中
|
||||||
capableBeanFactory.autowireBean(jobInstance);
|
Object jobInstance = super.createJobInstance(bundle);
|
||||||
return jobInstance;
|
capableBeanFactory.autowireBean(jobInstance);
|
||||||
|
log.debug("Job instance created and autowired: {}", jobInstance.getClass().getName());
|
||||||
|
return jobInstance;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error creating job instance for bundle: {}", bundle, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ import me.zhengjie.exception.BadRequestException;
|
||||||
import me.zhengjie.modules.quartz.domain.QuartzJob;
|
import me.zhengjie.modules.quartz.domain.QuartzJob;
|
||||||
import org.quartz.*;
|
import org.quartz.*;
|
||||||
import org.quartz.impl.triggers.CronTriggerImpl;
|
import org.quartz.impl.triggers.CronTriggerImpl;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -57,8 +56,12 @@ public class QuartzManage {
|
||||||
//重置启动时间
|
//重置启动时间
|
||||||
((CronTriggerImpl)cronTrigger).setStartTime(new Date());
|
((CronTriggerImpl)cronTrigger).setStartTime(new Date());
|
||||||
|
|
||||||
//执行定时任务
|
//执行定时任务,如果是持久化的,这里会报错,捕获输出
|
||||||
scheduler.scheduleJob(jobDetail,cronTrigger);
|
try {
|
||||||
|
scheduler.scheduleJob(jobDetail,cronTrigger);
|
||||||
|
} catch (ObjectAlreadyExistsException e) {
|
||||||
|
log.warn("定时任务已存在,跳过加载");
|
||||||
|
}
|
||||||
|
|
||||||
// 暂停任务
|
// 暂停任务
|
||||||
if (quartzJob.getIsPause()) {
|
if (quartzJob.getIsPause()) {
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
# 配置 quartz 分布式支持, sql 文件在 sql 目录下,需要导入到数据库,并且需要修改 application.yml 文件的 active: dev 配置
|
||||||
|
spring:
|
||||||
|
quartz:
|
||||||
|
# 必需,指定使用 JDBC 存储
|
||||||
|
job-store-type: jdbc
|
||||||
|
properties:
|
||||||
|
org:
|
||||||
|
quartz:
|
||||||
|
scheduler:
|
||||||
|
# 必需,指定调度器实例的名称
|
||||||
|
instanceName: eladmin
|
||||||
|
# 必需,指定调度器实例的 ID
|
||||||
|
instanceId: auto
|
||||||
|
threadPool:
|
||||||
|
# 可选,线程池的线程数量,可以根据需要调整
|
||||||
|
threadCount: 5
|
||||||
|
jobStore:
|
||||||
|
# 可选,如果你不需要集群,可以去掉
|
||||||
|
isClustered: true
|
||||||
|
# 可选,集群检查间隔时间,可以根据需要调整
|
||||||
|
clusterCheckinInterval: 10000
|
||||||
|
# 必需,指定 JDBC 驱动代理类
|
||||||
|
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
|
||||||
|
# 可选,是否使用属性存储,可以根据需要调整
|
||||||
|
useProperties: false
|
||||||
|
# 必需,指定表的前缀
|
||||||
|
tablePrefix: qrtz_
|
||||||
|
# 可选,指定误触发阈值,可以根据需要调整
|
||||||
|
misfireThreshold: 60000
|
|
@ -8,6 +8,7 @@ spring:
|
||||||
freemarker:
|
freemarker:
|
||||||
check-template-location: false
|
check-template-location: false
|
||||||
profiles:
|
profiles:
|
||||||
|
# 激活的环境,如果需要 quartz 分布式支持,需要修改 active: dev,quartz
|
||||||
active: dev
|
active: dev
|
||||||
data:
|
data:
|
||||||
redis:
|
redis:
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
drop table if exists qrtz_fired_triggers;
|
||||||
|
drop table if exists qrtz_paused_trigger_grps;
|
||||||
|
drop table if exists qrtz_scheduler_state;
|
||||||
|
drop table if exists qrtz_locks;
|
||||||
|
drop table if exists qrtz_simple_triggers;
|
||||||
|
drop table if exists qrtz_simprop_triggers;
|
||||||
|
drop table if exists qrtz_cron_triggers;
|
||||||
|
drop table if exists qrtz_blob_triggers;
|
||||||
|
drop table if exists qrtz_triggers;
|
||||||
|
drop table if exists qrtz_job_details;
|
||||||
|
drop table if exists qrtz_calendars;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
create table qrtz_triggers (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
trigger_name varchar(200) not null,
|
||||||
|
trigger_group varchar(200) not null,
|
||||||
|
job_name varchar(200) not null,
|
||||||
|
job_group varchar(200) not null,
|
||||||
|
description varchar(250) null,
|
||||||
|
next_fire_time bigint(13) null,
|
||||||
|
prev_fire_time bigint(13) null,
|
||||||
|
priority integer 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(200) null,
|
||||||
|
misfire_instr smallint(2) null,
|
||||||
|
job_data blob null,
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, job_name, job_group)
|
||||||
|
references qrtz_job_details(sched_name, job_name, job_group))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_simple_triggers (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
trigger_name varchar(200) not null,
|
||||||
|
trigger_group varchar(200) 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),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group)
|
||||||
|
references qrtz_triggers(sched_name, trigger_name, trigger_group))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_cron_triggers (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
trigger_name varchar(200) not null,
|
||||||
|
trigger_group varchar(200) not null,
|
||||||
|
cron_expression varchar(120) not null,
|
||||||
|
time_zone_id varchar(80),
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group)
|
||||||
|
references qrtz_triggers(sched_name, trigger_name, trigger_group))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_simprop_triggers (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
trigger_name varchar(200) not null,
|
||||||
|
trigger_group varchar(200) 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 numeric(13, 4) null,
|
||||||
|
dec_prop_2 numeric(13, 4) null,
|
||||||
|
bool_prop_1 varchar(1) null,
|
||||||
|
bool_prop_2 varchar(1) null,
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group)
|
||||||
|
references qrtz_triggers(sched_name, trigger_name, trigger_group))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_blob_triggers (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
trigger_name varchar(200) not null,
|
||||||
|
trigger_group varchar(200) not null,
|
||||||
|
blob_data blob null,
|
||||||
|
primary key (sched_name, trigger_name, trigger_group),
|
||||||
|
index (sched_name, trigger_name, trigger_group),
|
||||||
|
foreign key (sched_name, trigger_name, trigger_group)
|
||||||
|
references qrtz_triggers(sched_name, trigger_name, trigger_group))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_calendars (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
calendar_name varchar(200) not null,
|
||||||
|
calendar blob not null,
|
||||||
|
primary key (sched_name, calendar_name))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_paused_trigger_grps (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
trigger_group varchar(200) not null,
|
||||||
|
primary key (sched_name, trigger_group))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_fired_triggers (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
entry_id varchar(95) not null,
|
||||||
|
trigger_name varchar(200) not null,
|
||||||
|
trigger_group varchar(200) not null,
|
||||||
|
instance_name varchar(200) not null,
|
||||||
|
fired_time bigint(13) not null,
|
||||||
|
sched_time bigint(13) not null,
|
||||||
|
priority integer not null,
|
||||||
|
state varchar(16) not null,
|
||||||
|
job_name varchar(200) null,
|
||||||
|
job_group varchar(200) null,
|
||||||
|
is_nonconcurrent varchar(1) null,
|
||||||
|
requests_recovery varchar(1) null,
|
||||||
|
primary key (sched_name, entry_id))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_scheduler_state (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
instance_name varchar(200) not null,
|
||||||
|
last_checkin_time bigint(13) not null,
|
||||||
|
checkin_interval bigint(13) not null,
|
||||||
|
primary key (sched_name, instance_name))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create table qrtz_locks (
|
||||||
|
sched_name varchar(120) not null,
|
||||||
|
lock_name varchar(40) not null,
|
||||||
|
primary key (sched_name, lock_name))
|
||||||
|
engine=innodb;
|
||||||
|
|
||||||
|
create index idx_qrtz_j_req_recovery on qrtz_job_details(sched_name, requests_recovery);
|
||||||
|
create index idx_qrtz_j_grp on qrtz_job_details(sched_name, job_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_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_state on qrtz_triggers(sched_name, 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_n_g_state on qrtz_triggers(sched_name, trigger_group, trigger_state);
|
||||||
|
create index idx_qrtz_t_next_fire_time on qrtz_triggers(sched_name, 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_misfire on qrtz_triggers(sched_name, misfire_instr, 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_ft_trig_inst_name on qrtz_fired_triggers(sched_name, instance_name);
|
||||||
|
create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(sched_name, instance_name, requests_recovery);
|
||||||
|
create index idx_qrtz_ft_j_g on qrtz_fired_triggers(sched_name, job_name, job_group);
|
||||||
|
create index idx_qrtz_ft_jg on qrtz_fired_triggers(sched_name, job_group);
|
||||||
|
create index idx_qrtz_ft_t_g on qrtz_fired_triggers(sched_name, trigger_name, trigger_group);
|
||||||
|
create index idx_qrtz_ft_tg on qrtz_fired_triggers(sched_name, trigger_group);
|
||||||
|
|
||||||
|
commit;
|
Loading…
Reference in New Issue