【发布时间】:2018-09-19 15:28:25
【问题描述】:
在我的用例中,我有一个带有 Reactor Netty 的 Spring Webflux 微服务,我有以下依赖项:
-
org.springframework.boot.spring-boot-starter-webflux(2.0.1.RELEASE) -
org.springframework.boot.spring-boot-starter-data-mongodb-reactive(2.0.1.RELEASE) -
org.projectreactor.reactor-spring(1.0.1.RELEASE)
对于一个非常具体的情况,我需要从我的 Mongo 数据库中检索一些信息,并将其处理为使用我的响应式WebClient 发送的查询参数。由于WebClient 和UriComponentsBuilder 接受发布者(单声道/通量),我使用#block() 调用来接收结果。
由于reactor-core(版本0.7.6.RELEASE)已包含在最新的spring-boot-dependencies(版本2.0.1.RELEASE)中,因此无法再使用:block()/blockFirst()/blockLast() are blocking, which is not supported in thread xxx,参见->@987654321 @
我的代码sn-p:
public Mono<FooBar> getFooBar(Foo foo) {
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.add("size", foo.getSize());
parameters.addAll("bars", barReactiveCrudRepository.findAllByIdentifierIn(foo.getBarIdentifiers()) // This obviously returns a Flux
.map(Bar::toString)
.collectList()
.block());
String url = UriComponentsBuilder.fromHttpUrl("https://base-url/")
.port(8081)
.path("/foo-bar")
.queryParams(parameters)
.build()
.toString();
return webClient.get()
.uri(url)
.retrieve()
.bodyToMono(FooBar.class);
}
这适用于 spring-boot 版本 2.0.0.RELEASE,但由于升级到版本 2.0.1.RELEASE 并因此从 reactor-core 升级到版本 0.7.6.RELEASE,它不再被允许。
我看到的唯一真正的解决方案是包含一个块(非反应性)存储库/mongo 客户端,但我不确定是否鼓励这样做。有什么建议?
【问题讨论】:
-
感谢您指出这一点。我们有非常相似的代码,在我们下次升级时会遇到一些问题。
标签: spring-data-mongodb spring-webflux project-reactor reactor-netty