插入两个集合而不会阻塞

问题描述 投票:3回答:1

我目前正在使用Spring-WebFlux了解Project Reactor。

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

这是我的片段:

    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()
    }

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

有没有办法让我创建一个非阻塞操作,只调用DB 2次?

谢谢。

spring-boot kotlin spring-data-mongodb spring-webflux
1个回答
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 ANSWER,谢谢大卫:

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))
    }        
}
© www.soinside.com 2019 - 2024. All rights reserved.