我目前正在学习使用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的一种肮脏方式。由于第二操作是块操作。当然,我可以只做一个插入列表,然后插入详细信息,然后获取列表。但是,实际上这将调用数据库3次,而不是上面的代码两次。
我有什么方法可以创建非阻塞操作并且仅调用DB 2次吗?
谢谢。
答案 0 :(得分:0)
我对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回答,谢谢David:
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))
}
}