dynamic-datasource集成Quartz

返回
Author Avatar
钢翼
2020-12-16
编程
228

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;
    }
}