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