You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot 2.0集成Quartz:如何配置使用非主数据源

Spring Boot 2.0 配置Quartz使用非主数据源

没问题,我来帮你搞定Spring Boot 2.0里给Quartz指定非主数据源的配置,步骤清晰,跟着做就行:

1. 补充必要依赖

首先确保你的pom.xml里已经引入了Quartz和JDBC相关的starter,要是还没加,补充下面的依赖:

<dependencies>
    <!-- 主应用JDBC依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- Quartz调度器依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <!-- 数据库驱动(以MySQL为例) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2. 配置两个数据源

application.yml(或application.properties)里分别配置主业务数据源和Quartz专用数据源:

spring:
  # 主业务数据源
  datasource:
    url: jdbc:mysql://localhost:3306/business_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: business_user
    password: business_pass
    driver-class-name: com.mysql.cj.jdbc.Driver
    # Quartz专用数据源
    scheduler:
      url: jdbc:mysql://localhost:3306/quartz_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
      username: quartz_user
      password: quartz_pass
      driver-class-name: com.mysql.cj.jdbc.Driver
  # Quartz基础配置
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: always # 首次运行自动初始化Quartz表结构,后续可改为never

3. 手动注册数据源Bean

创建配置类,手动注册两个数据源的Bean,给主数据源标记@Primary确保业务代码默认使用它,Quartz数据源指定明确的名称:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    // 主业务数据源,标记为Primary
    @Primary
    @Bean(name = "businessDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource businessDataSource() {
        return DataSourceBuilder.create().build();
    }

    // Quartz专用数据源
    @Bean(name = "schedulerDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.scheduler")
    public DataSource schedulerDataSource() {
        return DataSourceBuilder.create().build();
    }
}

4. 配置Quartz绑定指定数据源

自定义Quartz的SchedulerFactoryBean,把我们的schedulerDataSource传入,覆盖Spring Boot默认的配置:

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.quartz.QuartzProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class QuartzConfig {

    private final QuartzProperties quartzProperties;

    public QuartzConfig(QuartzProperties quartzProperties) {
        this.quartzProperties = quartzProperties;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("schedulerDataSource") DataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        // 指定Quartz使用的数据源
        factory.setDataSource(dataSource);
        // 加载Quartz的配置属性
        Properties props = new Properties();
        props.putAll(quartzProperties.getProperties());
        factory.setQuartzProperties(props);
        // 配置启动时自动启动调度器
        factory.setAutoStartup(true);
        return factory;
    }

    @Bean
    public Scheduler scheduler(SchedulerFactoryBean schedulerFactoryBean) {
        return schedulerFactoryBean.getScheduler();
    }
}

5. 可选:配置Quartz专用事务管理器

如果你的Quartz任务需要事务支持,可以给它配置专用的事务管理器:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
public class TransactionConfig {

    @Bean(name = "schedulerTransactionManager")
    public PlatformTransactionManager schedulerTransactionManager(@Qualifier("schedulerDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

这样配置完成后,Quartz就会使用你指定的schedulerDataSource存储调度任务的元数据,主数据源依然正常供业务代码使用。

内容的提问来源于stack exchange,提问作者user1020455

火山引擎 最新活动