Как получить объект пользователя из Mono ‹User›, не блокируя его в Java?

У меня есть вызов репозитория, который даст мне Mono.

ex:

    private User getUserData (User user)
{
 Mono<User> monoUser=userRepository.insert(user);
  User user= monoUser.block; 
return user;
}

Как добиться этого без блокировки в пружинном реактиве. Я не хочу делать monoUser.block для получения объекта User.

После получения userObject мне нужно преобразовать id в UserId через Mapstruct. Также я хочу добиться этого без блокировки, чтобы использовать реактивную функцию.


person Ravi sinha    schedule 07.09.2020    source источник


Ответы (1)


Есть ряд вещей, которые вы можете делать с Mono вместо вызова block, вещи, которые не будут блокироваться. Единственное, что вы можете сделать, - это прикрепить к нему Consumer, который вызывается, когда действие Mono завершается успешно. Сигнатура метода для этого (на Mono):

Mono<T> doOnSuccess(Consumer<? super T> onSuccess)

Итак, вы можете продолжить работу, и ваш потребитель будет вызван, когда действие завершится. Затем этот вызов инициирует любые действия, которые вы хотите выполнить после добавления пользователя.

Вы помещаете в свой Consumer код, который записывает в базу данных. Если этому объекту нужна информация, например, дескриптор базы данных для записи, вы можете передать ему эту информацию при создании объекта, прежде чем передавать ее в вызов doOnSuccess. -

person CryptoFool    schedule 07.09.2020
comment
но для вставки в db мне нужно подписаться или заблокировать. с doOnSuccess данные не будут вставлены в Db. Как этого добиться при таком подходе? - person Ravi sinha; 08.09.2020
comment
См. Добавленный абзац в конце моего ответа. Добавляя Consumer, вы подписываетесь на событие ... событие, когда пользователь был успешно добавлен в репозиторий. - person CryptoFool; 08.09.2020
comment
Спасибо за предложение. Но иногда этот doOnSuccess дает мне объект Null. Не всегда. Также, если я устанавливаю задержку в 2 мс, он работает нормально. Любое предложение? - person Ravi sinha; 08.09.2020
comment
Это странно. Понятия не имею, о чем это. Это поведение будет функцией вашей реализации userRepository, о которой я, очевидно, ничего не могу знать. Может быть, вам нужно игнорировать любые объекты Null, которые вы получаете, и в конечном итоге вы получите тот, над которым действительно хотите действовать. Я не могу вспомнить, должен ли doOnSuccess вызывать ваш Consumer только один раз или он может вызываться несколько раз. Я бы подумал о первом, но тогда я не знаю, что бы вы сделали, если бы у вас был Null. - person CryptoFool; 08.09.2020