1

让我们考虑这个函数

@Transactional
fun conditionalInsertEntity(dbEntity: DBEntity): Mono<DBEntity> {
    return fetchObjectByPublicId(dbEntity.publicId)
        .switchIfEmpty {
            r2DatabaseClient.insert()
                .into(DBEntity::class.java)
                .using(Flux.just(dbEntity))
                .fetch()
                .one()
                .map { it["entity_id"] as Long }
                .flatMap { fetchObjectById(it) }
        }
}

在使用以下驱动程序代码运行上述功能时,如果列表包含重复项,则会出现重复输入错误。理想情况下它不应该给出那个错误,因为上面的函数已经在处理重复插入的情况了!!

val result = Flux.fromIterable(listOf(dbEntity1, dbEntity1, dbEntity2))
    .flatMap { conditionalInsertEntity(it) }
    .collectList()
    .block()
4

1 回答 1

1

意识到这是使用 flatMap 而不是 concatMap 的问题。与 flatMap 不同,ConcatMap 按顺序从各个发布者那里收集结果。(更多在这里

因为我使用了 flatMap,所以多个发布者认为该实体在数据库中不可用

于 2020-11-09T11:50:07.920 回答