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

xdyibdwo  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(446)

下面的代码是否阻止了调用,如果是,如何使其成为非阻塞的?i、 使React式java流的使用变得无用?如何在不阻塞呼叫的情况下分页?
目前,我有一个webclient调用一个后端服务,返回一个 Flux<Item> 根据规格,我需要退货 ResponseEntity<ItemListResponse> 我提供了一个分页的回应
控制器方法中的代码看起来像->

// 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());
              });
tjrkku2a

tjrkku2a1#

使用springwebflux对响应应用分页是否会导致阻塞?
分页本身并没有阻塞,但实现这一点的正常spring数据方法是使用 PagingAndSortingRepository 只在数据层中查询该特定页面所需的结果(与在数据层中查询所有可能的结果然后进行筛选相反,这可能会对性能产生巨大影响,具体取决于数据大小)。不幸的是,这种方法是阻塞的。这个 PagingAndSortingRepository 到目前为止还没有一个React等价物。
然而,这似乎不是你在这里要做的。一个完整的例子会很有帮助,但是看起来 r 是一个项目列表,然后将listpaginator应用于整个列表以缩小它。如果是这样的话,那么就没有理由一定会阻塞,所以应该是安全的。然而,如果不知道用户的具体行为,就不可能确定地说 applyPagination 以及 assembleItemResponse 方法。如果这些方法是阻塞的,那么不-您在这里不安全,您需要考虑另一种方法(确切地说,什么方法需要更完整的示例。)如果这些方法是非阻塞的(它们只处理它们拥有的数据,不调用任何其他web/db服务等),那么您就可以了。
另外,你可以考虑看看blockhound,它可以告诉你,你是否有任何阻塞呼叫不应该在那里。

相关问题