ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在Spring Webflux中返回多个Monos

2019-07-31 06:19:23  阅读:916  来源: 互联网

标签:spring-webflux spring reactive-programming


我正在尝试使用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;

}

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服务调用,然后将它们组合起来而不需要可完成的期货等?

解决方法:

我认为您应该返回一个对象的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
}

并且,在您的控制器上,您执行以下操作:

@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发出项时,带有esMono.map的操作链fasMono.flatMap构建CombinedResults.当尝试将两个Monos连接成一个时,这种组合很常见.我想你也可以使用zip操作符加入Monos.
所有这些都与WebClient无关.如果你的getSearchResults只执行异步非阻塞操作,那么一切都是异步非阻塞.

标签:spring-webflux,spring,reactive-programming
来源: https://codeday.me/bug/20190731/1587553.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有