Spring WebFlux flatmap возвращает Mono

#spring #kotlin #spring-webflux

#весна #kotlin #spring-webflux

Вопрос:

У меня есть веб-приложение, написанное на Kotlin. Это чат, похожий на Discord. У меня есть функция, которая выполняет несколько действий. Сама функция используется для удаления учетной записи пользователя, но при этом она также удаляет сообщения, которые он когда-либо списывал из базы данных, он удаляется из всех групп в базе данных, а в группах, где он был администратором, выбирается новый администратор.

И эта функция выглядит так:

 fun deleteAccount(userId: String) : Flux<Void>{
        return groupRepository.findAllByAdmin(userId)
                .flatMap{
                    if(it.users.size<1) groupRepository.deleteById(it._id)
                    it.admin = it.users[0]
                    it.users.remove(userId)
                    groupRepository.save(it)
                }
                .flatMap {
                    messageRepository.deleteMessageByUserId(userId)
                    userRepository.deleteById(userId)
                }

    } 
 

Мои репозитории выглядят так:

 @Repository
interface GroupRepository : ReactiveCrudRepository<GroupRequest, String> {

    fun findByName(name: String): Mono<GroupRequest>
    fun existsByName(name: String): Mono<Boolean>
    fun findAllByAdmin(admin:String) : Flux<GroupRequest>

}

@Repository
interface MessageRepository : ReactiveCrudRepository<Message, String> {

    fun findMessageByGroupId(groupId: String): Flux<Message>
    fun deleteMessageByUserId(userId:String) : Mono<Void>
}
 

Итак, последние 2 оператора в моей функции возвращают void Mono.
Проблема в том, что не имеет значения, какой оператор выполняется первым, выполняется только один из 2 операторов, и теперь я попробовал несколько вещей, в том числе Flux.zip он не работает полностью. Если я сначала помещаю deleteMessages, все работает, кроме той части, где пользователь удаляется из базы данных. В чем проблема в этой функции и как я могу ее исправить?

Ответ №1:

Я исправил это, заархивировав оба оператора во второй flatMap, выглядит так:

 fun deleteAccount(userId: String) : Flux<Void>{
        return groupRepository.findAllByAdmin(userId)
                .flatMap{
                    if(it.users.size<1) groupRepository.deleteById(it._id)
                    it.admin = it.users[0]
                    it.users.remove(userId)
                    groupRepository.save(it)
                }
                .flatMap {
                    Mono.zip(messageRepository.deleteMessageByUserId(userId),userRepository.deleteById(userId)).map {
                        it.t1
                    }
                }

    }
 

Ответ №2:

Возможно, вы ищете Mono.when() , если все, о чем вы заботитесь, — это сигнал завершения.