gpt4 book ai didi

spring-boot - 无阻塞地插入两个集合

转载 作者:行者123 更新时间:2023-12-04 02:58:59 25 4
gpt4 key购买 nike

我目前正在学习使用 Spring-WebFlux 的 Project Reactor。

我创建了一个简单的服务,它将按顺序插入到两个集合中。首先,我的服务将插入到列表集合中,然后插入到详细信息集合中。如果两个操作都成功,它将返回第一个操作(插入列表集合)的实例,如果其中一个操作不成功,它将回滚之前操作创建的任何更改。

这是我的代码片段:

    override fun insert(business: Business): Mono<Business> = businessRepository.save(business)
.doOnSuccess { businezz ->
val businessDetails = businezz.businessDetails
businessDetails!!.idBusiness = businezz.id
businessDetailsService.insert(businessDetails).doOnError {
businessRepository.delete(businezz).subscribe()
}.subscribe()
}

我觉得这是一种创建 Mono 的肮脏方式。由于第二个操作是 block 操作。当然,我可以先插入列表,然后插入详细信息,然后获取列表。但是,这实际上将调用数据库 3 次,而不是像我上面的代码那样调用 2 次。

有什么方法可以让我创建一个非阻塞操作并且只调用数据库 2 次?

谢谢。

最佳答案

我不熟悉 Kotlin,但是对于 Java,您可以这样做:

Mono<Business> insert(Business business) {
return businessRepository.save(business)
.flatMap(businezz -> {
BusinessDetails businessDetails = ...;
return businessDetailsService.insert(businessDetails)
.onErrorResume(throwable -> businessRepository
.delete(businezz)
.then(Mono.empty()))
.then(Mono.just(businezz));
});
}

KOTLIN 回答,谢谢大卫:

override fun insert(business: Business): Mono<Business> {
return businessRepository.save(business).flatMap { businezz ->
val businessDetails = businezz.businessDetails
businessDetailsService.insert(businessDetails!!).onErrorResume {
businessRepository.delete(businezz).then(Mono.empty())
}.then(Mono.just(businezz))
}
}

关于spring-boot - 无阻塞地插入两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55076198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com