在 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