无法获取R2DBC,此发布者不支持多个订阅者。

4
我尝试使用spring-boot-starter-data-r2dbc和oracle-r2dbc运行r2dbc应用程序,但它给我一个异常" org.springframework.dao.DataAccessResourceFailureException:Failed to obtain R2DBC Connection; nested exception is java.lang.IllegalStateException:This publisher does not support multiple subscribers"。
这是我的属性文件:
spring.r2dbc.url=r2dbc:oracle:thin://localhost:1521:orcl
spring.r2dbc.username=user
spring.r2dbc.password=password

Gradle文件中的依赖项部分:

dependencies {
    ktlint 'com.pinterest:ktlint:0.41.0'
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
    implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
    implementation('com.fasterxml.jackson.module:jackson-module-kotlin')
    implementation('org.codehaus.janino:janino')
    implementation('org.springframework.cloud:spring-cloud-starter-stream-kafka')
    implementation('org.springframework.cloud:spring-cloud-stream')
    implementation('org.springframework.boot:spring-boot-configuration-processor')
    implementation('org.apache.httpcomponents:httpclient:4.5.8')
    implementation('org.springframework.retry:spring-retry')
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation('org.springframework.boot:spring-boot-starter-data-r2dbc')
    implementation('com.oracle.database.r2dbc:oracle-r2dbc')
    implementation('com.oracle.database.jdbc:ojdbc11:21.1.0.0')
}

这里的代码部分引起了错误:

message.flatMap { fromMessage ->
                Mono
                    .zip(
                        listOf(
                            dimensionAdviserRepository
                                .findFirstByEntityIdOrderByFromDateDescToDateDesc(message.adviserKey)
                                .map { it?.adviserKey ?: -1L }
                                .switchIfEmpty(Mono.just(-1L)),
                            dimensionAccountRepository
                                .findFirstByEntityIdOrderByFromDateDescToDateDesc(fromMessage.accountKey!!)
                                .map { it?.account_key ?: -1L }
                                .switchIfEmpty(Mono.just(-1L))
))}

我是否遗漏了任何配置,或者这是一个已知的限制?


你正在使用哪个版本的Oracle?你能展示一下你的pom.xml文件或者build.gradle文件吗? - Shawrup
我刚刚更新了gradle文件,oracle的版本是11.0.2.4。 - Xuân Dũng Đoàn
根据Oracle R2DBC GitHub页面,您还需要'com.oracle.database.jdbc:ojdbc11:21.1.0.0'依赖项。请尝试使用此依赖项。 - Shawrup
@Shawrup 我已经尝试过了,但还是一样。我已经更新了代码,导致了那个异常。 - Xuân Dũng Đoàn
1个回答

2
看起来您自己在 Oracle R2DBC Github 存储库中 开了一个票,提出了这个确切的问题,并得到了答案。
帮助其他有同样问题的人:
这是 Oracle R2DBC 版本 0.1.0 的已知限制。它已经在版本 0.2.0 中得到修复,但该版本针对的是 R2DBC SPI 版本 0.9,目前 Spring Data R2DBC 还不支持它,因为它尚未发布为普通可用性。
R2DBC SPI 版本 0.9 的 GA 发布计划于 2021 年 12 月 06 日,之后我们可以期待 Spring Data R2DBC 实现对其的支持,从而可以升级 Oracle R2DBC 驱动程序并摆脱这个限制。 (原文链接)
编辑:根据计划,R2DBC SPI的版本0.9.0.RELEASE 已于昨天发布。现在只需要等待一个支持R2DBC SPI 0.9版本的Spring Data R2DBC新版本即可。

1
SpringBoot v2.7.5 包含 io.r2dbc:r2dbc-spi:0.9.1.RELEASE。现在已经修复了! - Marcus Voltolim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接