Sut*_*000 3 spring reactive-programming spring-webflux
我正在尝试使用SpringBoot 2.0和新的反应式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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将此称为响应,我得到的是
{
"fasSearchResponse": {
"scanAvailable": true
},
"esSearchResponse": {
"scanAvailable": true
}
}
Run Code Online (Sandbox Code Playgroud)
而不是SearchResponse对象的内容。我觉得我可能错过了应该如何工作的基本要点!我的想法是,因为WebClient没有阻塞,所以我可以触发对Web服务的两次调用,然后将它们组合在一起而无需完成期货等?
Spring WebFlux不支持嵌套的反应类型。您应该改成这样:
Mono<SearchResponse> fasMono = searchService.getSearchResults(searchTerm, "fh");
Mono<SearchResponse> esMono = searchService.getSearchResults(searchTerm, "es");
Mono<CombinedResults> results = fasMono.zipWith(esMono,
(fas, es) -> {return new CombinedResults(fas, es);});
Run Code Online (Sandbox Code Playgroud)
小智 4
我认为你应该返回一个代表此操作响应的模型的对象的 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
}
Run Code Online (Sandbox Code Playgroud)
并且,在您的控制器上执行如下操作:
@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;
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您将返回一个 Mono 对象,其中包含您想要的响应。当两个 Mono 发出项目时,fasMono.flatMap构建操作链。当尝试将两个 Mono 合而为一时,这种组合相当常见。我想你也可以使用operator来加入Monos。这一切都与WebClient无关。如果您只执行异步非阻塞操作,那么一切都是异步非阻塞的。esMono.mapCombinedResultszipgetSearchResults
| 归档时间: |
|
| 查看次数: |
2254 次 |
| 最近记录: |