使用 Spring Webflux 对响应应用分页会使其阻塞吗?
Does applying Pagination on response using Spring Webflux make it blocking?
下面的代码是否会阻塞调用,如果是,我如何使其成为非阻塞的?即使 Reactive Java Stream 无用?如何在不阻塞调用的情况下进行分页?
目前我有一个 webClient 调用 return 一个 Flux<Item>
的后端服务,根据规范我需要 return 一个 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());
});
Does applying Pagination on response using Spring Webflux make it blocking?
关于分页,本质上 没有任何阻塞,但是正常的 Spring 数据实现方法是使用 PagingAndSortingRepository
查询数据层只有该特定页面所需的结果(而不是查询数据层以获取所有可能的结果然后进行过滤,这可能会对性能产生巨大影响,具体取决于数据大小。)不幸的是,这种方法 is 阻塞。 PagingAndSortingRepository
目前还没有对应的反应式。
但是,这似乎不是您在这里所做的。此处的完整示例会有所帮助,但看起来 r
是一个项目列表,然后您将 listPaginator 应用于整个列表以减少它。如果是这样,那么就没有理由 必然 阻塞,所以它应该是安全的。但是,如果不了解 applyPagination
和 assembleItemResponse
方法的具体行为,就无法确定。如果这些方法是阻塞的,那么不——你在这里不安全,你需要考虑另一种方法(究竟哪种方法需要一个更完整的例子。)如果这些方法是非阻塞的(它们只处理它们拥有的数据, 不要调用任何进一步的 web / db 服务等) 然后你就可以了。
另外,您可以考虑查看 Blockhound,它将能够确定地告诉您是否有任何不应该出现的阻塞调用。
下面的代码是否会阻塞调用,如果是,我如何使其成为非阻塞的?即使 Reactive Java Stream 无用?如何在不阻塞调用的情况下进行分页?
目前我有一个 webClient 调用 return 一个 Flux<Item>
的后端服务,根据规范我需要 return 一个 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());
});
Does applying Pagination on response using Spring Webflux make it blocking?
关于分页,本质上 没有任何阻塞,但是正常的 Spring 数据实现方法是使用 PagingAndSortingRepository
查询数据层只有该特定页面所需的结果(而不是查询数据层以获取所有可能的结果然后进行过滤,这可能会对性能产生巨大影响,具体取决于数据大小。)不幸的是,这种方法 is 阻塞。 PagingAndSortingRepository
目前还没有对应的反应式。
但是,这似乎不是您在这里所做的。此处的完整示例会有所帮助,但看起来 r
是一个项目列表,然后您将 listPaginator 应用于整个列表以减少它。如果是这样,那么就没有理由 必然 阻塞,所以它应该是安全的。但是,如果不了解 applyPagination
和 assembleItemResponse
方法的具体行为,就无法确定。如果这些方法是阻塞的,那么不——你在这里不安全,你需要考虑另一种方法(究竟哪种方法需要一个更完整的例子。)如果这些方法是非阻塞的(它们只处理它们拥有的数据, 不要调用任何进一步的 web / db 服务等) 然后你就可以了。
另外,您可以考虑查看 Blockhound,它将能够确定地告诉您是否有任何不应该出现的阻塞调用。