dynamic-datasource集成Quartz
钢翼
编程
dynamic-datasource集成Quartz
如果不是用dynamic-datasource,则第3步和第5步改下数据源即可。
1.引入dynamic-datasource-spring-boot-starter 和 quartz-starter
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.创建quartz数据库,并初始化建表语句(以下表只是quartz持久化所需,非业务相关的表)
-- 存储每一个已配置的 Job 的详细信息
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 tinyint(1) not null,
is_nonconcurrent tinyint(1) not null,
is_update_data tinyint(1) not null,
requests_recovery tinyint(1) not null,
job_data blob null,
primary key (sched_name, job_name, job_group)
);
-- 存储已配置的 Trigger 的信息
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)
);
-- 存储简单的Trigger,包括重复次数,间隔,以及已触的次数
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)
);
-- 存储 Cron Trigger,包括 Cron表达式和时区信息
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(200) 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)
);
-- 自定义的triggers使用blog类型进行存储,非自定义的triggers不会存放在此表中
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),
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS (sched_name, trigger_name, trigger_group)
);
-- 以 Blob 类型存储 Quartz 的 Calendar 信息
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)
);
-- 存储已暂停的 Trigger 组的信息
create table QRTZ_PAUSED_TRIGGER_GRPS
(
sched_name varchar(120) not null,
trigger_group varchar(200) not null,
primary key (sched_name, trigger_group)
);
-- 存储与已触发的 Trigger 相关的状态信息,以及相联 Job的执行信息
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 tinyint(1) null,
requests_recovery tinyint(1) null,
primary key (sched_name, entry_id)
);
-- 存储少量的有关 Scheduler 的状态信息,和别的 Scheduler实例(假如是用于一个集群中)
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)
);
-- 存储程序的 悲观锁的信息(假如使用了悲观锁)
create table QRTZ_LOCKS
(
sched_name varchar(120) not null,
lock_name varchar(40) not null,
primary key (sched_name, lock_name)
);
-- 存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器
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 tinyint(1) null,
bool_prop_2 tinyint(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)
);
3.配置动态数据源,增加quartz
spring:
dynamic:
datasource:
db1:
driver-class-name: org.h2.Driver
url: jdbc:h2:tcp://localhost:9092//db1
username: root
password: 123456
platform: h2
db2:
driver-class-name: org.h2.Driver
url: jdbc:h2:tcp://localhost:9092//db2
username: root
password: 123456
platform: h2
quartz:
driver-class-name: org.h2.Driver
url: jdbc:h2:tcp://localhost:9092//quartz
username: root
password: 123456
platform: h2
4.配置quartz参数
quartz:
properties:
org:
quartz:
scheduler:
instanceName: avocadoScheduler
instanceId: AUTO
jobStore: #JobStore配置
class: org.quartz.impl.jdbcjobstore.JobStoreTX
isClustered: true
clusterCheckinInterval: 15000
maxMisfiresToHandleAtATime: 1
txIsolationLevelSerializable: true
misfireThreshold: 12000
tablePrefix: QRTZ_
threadPool: #线程池配置
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5
startup-delay: 1 #延迟1秒启动
overwrite-existing-jobs: true #启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
auto-startup: true #设置自动启动,默认true
scheduler-name: avocadoScheduler
5.bean注入
@Component
public class ScheduleConfig {
@Autowired
private DynamicRoutingDataSource dynamicRoutingDataSource;
@Order(1)
@Bean
public SchedulerFactoryBean schedulerFactoryBeanCustomizer() {
DataSource dataSource = this.dynamicRoutingDataSource.getDataSource("quartz");
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setDataSource(dataSource);
schedulerFactoryBean.setTransactionManager(new DataSourceTransactionManager(dataSource));
schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContextKey");
return schedulerFactoryBean;
}
}