Получение результата Mono для передачи его в JpaRepository или другой нереактивный класс - PullRequest
0 голосов
/ 14 сентября 2018

Я хотел бы знать, как правильно получить объект из Mono (или Flux) для перехода на нереактивный метод, такой как JpaRepository.

Вот как я это сделал:

@Service
public class ReactiveAccountService {

    //AccountService's methods take non-mono/non-flux objects as arguments
    private AccountService accountService;

    public ReactiveAccountService(AccountService accountService) {
        this.accountService = accountService;
    }

    public Mono<Void> signUp(Mono<Account> accountMono) {
        //Account is a Jpa entity
        accountMono.subscribe(account -> accountService.signUp(account));
        return Mono.empty();
    }

}

Как это можно улучшить? Может кто-нибудь посоветовать, пожалуйста?

1 Ответ

0 голосов
/ 14 сентября 2018

Лучший способ сделать это так:

public Mono<Void> signUp(Mono<Account> accountMono) {
    //Account is a Jpa entity
    return accountMono.flatMap(account -> {
                  accountService.signUp(account);
                  return Mono.empty();
              });
}

Таким образом, вы следуете требованиям Reactive Streams и не мешаете потоку выполнения вашим кодом блокировки. Кроме того, в соответствии с требованиями Spring WebFlux вы не подписываетесь в своем собственном коде, но все задерживаете контейнер, который является инициатором этого Mono<Account>. Фактическое выполнение произойдет, когда в контейнере Web (Reactive) будет достаточно ресурсов для подписки на возвращенный Mono.

...