3

在 Spring Boot 中使用 R2DBC 时,我一直试图让 Quartz 工作。到目前为止,我还没有弄清楚如何做到这一点。这是因为在创建 JDBC 数据源时,它会尝试初始化我的 R2DBC 存储库,这是因为 R2DBC 本质上是反应式的,而 JDBC 本质上是阻塞的。

我考虑过的替代品

  • 为 Quartz 使用内存数据库---这有 Quartz 不再持久化作业的问题。我可以通过使用 R2DBC 单独跟踪作业然后在启动时重新注册所有作业来解决这个问题,但这似乎我会复制很多 Quartz 的功能。
  • 查找基于 R2DBC 的调度程序---没有。

相关 Gradle 依赖项

dependencies {
    implementation("io.projectreactor.netty:reactor-netty:0.9.7.RELEASE")

    implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
    implementation("org.springframework.boot:spring-boot-starter-quartz")
    implementation("org.springframework.boot:spring-boot-starter-data-jdbc")

    runtimeOnly("com.h2database:h2")
    implementation("io.r2dbc:r2dbc-h2:0.8.3.RELEASE")
}

我当前的 Quartz 配置

@Configuration
class QuartzConfig {
    @Bean
    @QuartzDataSource
    fun dataSource(props: DataSourceProperties): DataSource {
        return props.initializeDataSourceBuilder().type(HikariDataSource::class.java).build()
    }
}

相关 R2DBC 配置:

abstract class R2DbcConfiguration : AbstractR2dbcConfiguration() {
    override fun getCustomConverters(): MutableList<Any> {
        return mutableListOf(
            // some custom converters
        )
    }

    @Bean
    fun connectionFactoryInitializer(
        factory: ConnectionFactory
    ): ConnectionFactoryInitializer {
        val init = ConnectionFactoryInitializer()
        init.setConnectionFactory(factory)
        val populator = CompositeDatabasePopulator()
        populator.addPopulators(ResourceDatabasePopulator(ClassPathResource("schema.sql")))
        init.setDatabasePopulator(populator)
        return init
    }
}


@Configuration
class ReleaseR2DbcConfiguration : R2DbcConfiguration() {
    @Bean
    override fun connectionFactory(): ConnectionFactory {
        val config = H2ConnectionConfiguration.builder().file("./state").build()
        return H2ConnectionFactory(config)
    }
}

应用程序属性:

logging.level.org.springframework.data.r2dbc=DEBUG
logging.level.org.springframework.data.jdbc=DEBUG
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.datasource.url=jdbc:h2:file:./state
4

0 回答 0