Использование реактивного репозитория во время инициализации компонента - нужно ли блокировать ()? - PullRequest
0 голосов
/ 15 мая 2019

Я бы хотел создать бин JavaMailSender в Spring 5, считывая свойства из реактивной базы данных.

@Bean
public JavaMailSender javaMailSender() {
   JavaMailSender javaMailSender = new JavaMailSender();

   Settings settings = settingsRepository.findByXXX().block(); //returns Mono<Settings> -> Settings after blocking
   //copy stuff from settings to javaMailSender

   return javaMailSender;
}

Есть ли другой способ, кроме блокировки, чтобы сделать это?

1 Ответ

2 голосов
/ 15 мая 2019

Вы должны полностью избегать использования .block() в Spring-Webflux или любой другой реактивной среде. Блокируя, вы не будете делать ничего другого, кроме блокирования текущего потока, поэтому вы создадите избыточное приложение. Вместо блокировки вы можете использовать такие функции, как .map() или .flatMap() и обрабатывать объект внутри моно реактивным образом.

EDIT

@Bean
    public Mono<JavaMailSender> javaMailSender() {
        return settingsRepository.findByXXX().flatMap(settings -> {

            if(something) {
                return Mono.just(new JavaMailSender());
            } else {
                return Mono.error(new RuntimeException());
            }

        });
    }
...