gpt4 book ai didi

spring - 在 Spring Webflux 中返回多个 Monos

转载 作者:行者123 更新时间:2023-12-01 08:47:44 27 4
gpt4 key购买 nike

我正在尝试使用 SpringBoot 2.0 和新的响应式(Reactive) webFlux 库。我想知道如何将通过无阻塞 WebClient 进行的两次调用的结果返回给 Springboot API 的调用者。我的代码是:

@RequestMapping("/search")
public CombinedResults perfomSearch(@RequestParam final String searchTerm) {
Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
CombinedResults combinedResults = new CombinedResults(fasMono, esMono);
return combinedResults;

}

CombinedResult 对象只是一个 POJO:
public class CombinedResults {

private Mono<SearchResponse> fasSearchResponse;

private Mono<SearchResponse> esSearchResponse;

public CombinedResults(final Mono<SearchResponse> fasSearchResponse, final Mono<SearchResponse> esSearchResponse) {
this.fasSearchResponse = fasSearchResponse;
this.esSearchResponse = esSearchResponse;
}

public Mono<SearchResponse> getFasSearchResponse() {
return fasSearchResponse;
}

public void setFasSearchResponse(final Mono<SearchResponse> fasSearchResponse) {
this.fasSearchResponse = fasSearchResponse;
}

public Mono<SearchResponse> getEsSearchResponse() {
return esSearchResponse;
}

public void setEsSearchResponse(final Mono<SearchResponse> esSearchResponse) {
this.esSearchResponse = esSearchResponse;
}

但是,如果我称之为这个,我得到的回应是
{
"fasSearchResponse": {
"scanAvailable": true
},
"esSearchResponse": {
"scanAvailable": true
}
}

而不是 SearchResponse 对象的内容。我觉得我可能错过了它应该如何工作的基本点!我的想法是,因为 WebClient 没有阻塞,所以我可以触发对 Web 服务的两个调用,然后将它们组合起来,而无需可完成的 future 等?

最佳答案

我认为您应该返回代表此操作响应的模型的对象的 Mono。假设 CombinedResults 是您的模型。这个类应该是这样的:

public class CombinedResults {

private SearchResponse fasSearchResponse;

private SearchResponse esSearchResponse;

public CombinedResults(final SearchResponse fasSearchResponse, final SearchResponse esSearchResponse) {
this.fasSearchResponse = fasSearchResponse;
this.esSearchResponse = esSearchResponse;
}

//... getters AND/OR setters
}

而且,在您的 Controller 上,您可以执行以下操作:
@RequestMapping("/search")
public Mono<CombinedResults> perfomSearch(@RequestParam final String searchTerm) {
Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
Mono<CombinedResults> combinedResults =
fasMono
.flatMap(fh -> esMono.map(es -> new CombinedResults(fh, es)));
return combinedResults;
}

通过这种方式,您将返回一个 Mono 对象,其中包含您想要的内容作为响应。当 Mono 发出项目时, fasMono.flatMapesMono.map 的操作链会构建 CombinedResults。当尝试将两个 Mono 合并为一个时,这种组合很常见。我认为您也可以使用 zip 运算符加入 Monos。
所有这些都与 WebClient 无关。如果您的 getSearchResults 只执行异步非阻塞操作,那么一切都是异步非阻塞操作。

关于spring - 在 Spring Webflux 中返回多个 Monos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com