Вставка в две коллекции без блокировки - PullRequest
3 голосов
/ 09 марта 2019

В настоящее время я изучаю Project Reactor с использованием Spring-WebFlux.

Я создал простой сервис, который будет последовательно вставляться в две коллекции. Во-первых, мой сервис будет вставлен в коллекцию списков, а после этого он будет вставлен в коллекцию деталей. Если обе операции завершатся успешно, он вернет экземпляр первой операции (Вставить в коллекцию списков), если одна из них не удастся, он отменит все изменения, созданные этой операцией до нее.

Вот мой фрагмент:

    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 раза, как мой код выше.

Можно ли как-нибудь создать неблокирующую операцию и только дважды вызывать БД?

Спасибо.

1 Ответ

0 голосов
/ 09 марта 2019

Я не знаком с 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));
            });
}

КОТЛИН ОТВЕТ, спасибо Дэвид:

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