在bean初始化期间使用反应式存储库-我需要block()吗?

时间:2019-05-15 19:56:20

标签: spring spring-webflux project-reactor

我想在Spring 5中创建一个JavaMailSender bean,从反应数据库中读取属性。

@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 个答案:

答案 0 :(得分:2)

您应该完全避免在Spring-Webflux或任何类型的反应框架中使用.block()。通过阻塞,除了阻塞当前线程外,您什么都不会做,因此会对应用程序产生过大的杀伤力。除了阻塞之外,您还可以使用.map().flatMap()之类的函数并以反应方式处理单声道内部的对象。

编辑

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

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

        });
    }