当前位置: 首页 > 知识库问答 >
问题:

使用SpringWebFlux对响应应用分页是否会导致阻塞?

公羊曜灿
2023-03-14

下面的代码是否阻止调用,如果是,如何使其成为非阻塞?i、 e.使反应式Java流的使用变得无用?如何在不阻塞呼叫的情况下分页?

目前,我有一个webClient调用后端服务,该服务返回流量

控制器方法中的代码如下所示-

// getItems method was initially returning a Flux but my method was failing to paginate it so now that method returns a Mono<List<Item>>
// I would really like to see how I can make this work with Flux!
return webClient.getItems(...required params...)
           .map(r -> {
              // we get offset and limit from query params
              var paginatedItems = listPaginator.applyPagination(r, offset, limit)
              // assembleItemResponse method maps all values from backend service to new response required by client
              List<ItemResponse> itemResponseList = paginatedItems.stream()
                       .map(this::assembleItemResponse)
                       .collect(Collectors.toList());

              return ResponseEntity.ok()
                         .body(ItemListResponse.builder()
                                 .itemCount(r.size())
                                 .pagesize(itemResponseList.size())
                                 .listItems(itemResponseList)
                                 .build());
              });


共有1个答案

吉鸿宝
2023-03-14

使用SpringWebFlux对响应应用分页是否会导致阻塞?

分页本身没有任何阻塞,但实现这一点的正常Spring数据方法是使用分页和排序存储库查询数据层,仅获取该特定页面所需的结果(与查询数据层中所有可能的结果然后进行过滤相反,这可能会根据数据大小产生巨大的性能影响)不幸的是,这一方法正在受阻。到目前为止,PagingAndSortingRepository还没有对应的响应式存储库。

然而,这似乎不是你在这里要做的。这里有一个完整的示例可能会有所帮助,但它看起来像是一个项目列表,然后您将对整个列表应用一个listPaginator来减少它。如果是这样的话,那么它就没有必要被阻塞,所以它应该是安全的。但是,如果不知道applyPaginationassembleetemresponse方法的具体行为,就无法确定。如果这些方法是阻塞的,那么你在这里不安全,你需要考虑另一种方法(确切地说,什么方法需要一个更完整的例子)。如果这些方法是非阻塞的(它们只处理它们拥有的数据,不调用任何其他web/db服务等),那么您就可以了。

另外,你可以考虑看一下Blockhound,这样你就能确定你是否有任何阻塞电话。

 类似资料:
  • 我正在制作一个跳棋游戏,下面的代码导致应用程序在运行时没有响应对话框。我如何使代码高效和删除Anr对话框。

  • 我有一个JTable,其中有一行自定义对象,其中一列是倒计时的时间组件。当倒计时达到0时,该行将自动删除。 我还通过文本框提供了一个过滤选项,用户可以在其中键入文本框,根据数据过滤行。 如果没有应用于JTable的排序器,除了过滤之外,一切都可以正常工作(当时间计数为0时,行会自行删除)。应用排序器会给我一个"java.lang.IndexOutOfBoundsException:无效索引" 我的

  • 问题内容: 我怀疑Java代码中未使用的导入和未使用的对象是否会对性能产生影响? 假设一个对象已初始化并且从未使用过,会发生什么?未使用进口的成本是多少 问题答案: 这是一个非常普遍的问题。 像大多数性能问题一样,最好的方法是编写最清晰,最简单的代码,因为这样可以提高代码的可维护性,并有助于确保代码即使更改后也能正常运行。(聪明/难以理解/不必要地开始,详细的代码可以快速运行,但是由于只是凡人而改

  • 我运行以下命令(它是一个lib项目,但我也在常规项目中得到它):

  • 问题内容: 快速的问题,我已经尝试自己弄清楚这一点,但是在试图弄清页面为什么或如何重新加载以及正在/不应该执行其应做的工作时,使用会话变量可能会造成混淆。 在任何(非脚本)情况下,页面重新加载(使用JavaScript,f5,ctrl + f5,浏览器重新加载按钮等)是否会导致表单重新发布? (这与在C#代码中使用IfPost分支有关,例如下面的示例代码): 我只是需要知道在这里期望什么,以便可以

  • 我有一个来自URL的分页响应,我想继续点击我从上一个响应中获得的下一页URL,并继续收集项目,直到我的响应中没有“nextPage”URL。如何使用WebFlux的Spring引导WebClient在没有阻塞的情况下以反应式方式实现这一点? 在这里,我创建了模拟网址https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/it