Actualmente estoy aprendiendo sobre Project Reactor usando Spring-WebFlux.
Creé un servicio simple que se insertará en dos colecciones en una secuencia. En primer lugar, mi servicio se insertará en la colección de listas y luego se insertará en la colección de detalles. Si ambas operaciones tienen éxito, devolverá una instancia de la primera operación (Insertar en la colección de listas), si una de ellas no tiene éxito, revertirá los cambios creados por la operación anterior.
Aquí está mi fragmento:
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() }Siento que esta es una forma sucia de crear un Mono. Dado que la segunda operación es una operación de bloque. Por supuesto, podría simplemente hacer una lista de inserción, luego insertar detalles y luego obtener la lista. Pero, esto en realidad llamará a la base de datos 3 veces, en lugar de 2 veces como mi código anterior.
¿Hay alguna forma de que pueda crear una operación sin bloqueo y solo llamar a la base de datos 2 veces?
Gracias.
No estoy familiarizado con Kotlin, pero con Java podrías hacerlo así:
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)); }); }RESPUESTA DE KOTLIN, gracias 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)) } }