在 bean 初始化期间使用反应式存储库 - 我需要 block() 吗?
Using reactive repository during bean initialization - do I need to block()?
我想在 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;
}
除了阻止还有其他方法吗?
你应该完全避免在 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());
}
});
}
我想在 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;
}
除了阻止还有其他方法吗?
你应该完全避免在 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());
}
});
}