java - Java反应式编程中的分页
问题描述
我还是 Java 反应式编程的新手,我的项目要求希望我用 Java 中的反应式编程实现分页。
就像我打了一个 API,它在流中返回了 10000 条记录,那么我需要返回一个带有适当分页的通量。
任何人都可以建议我一个好的方法吗?
就像这就是我正在遵循的方法。
存储库
public interface CouchBaseRepository extends ReactiveCouchBaseRepository<Book,Integer> {
@Query("#{#n1ql.selectEntity} where name=$1")
public Flux<Book> getPaginatedFlux(String name ,final Pageable pageable);
这是我的存储库,但是当我启动我的应用程序时,它会显示以下错误。
java.lang.IllegalStateException: Method has to have one of the following return types! [interface org.springframework.data.domain.Page, interface org.springframework.data.domain.Slice, interface java.util.List]
我不能在这里使用页面接口,因为它被阻塞了,所以有什么办法可以解决这个问题吗?
解决方案
我还没有使用过 spring-webflux,所以我不能对特定的 API 调用发表评论,但我会提供一个“理论上的”答案,这可能也会有所帮助。
Flux 表示数据流(可能是无限的)。所以,分页有点不符合反应性,只是因为他们在谈论不同的事情
考虑在根据您的要求返回(逻辑决定的)多达 10000 条记录的通量的方法中使用输入参数(如通常的限制/偏移量)实现分页。
因此,一个调用将以“反应性方式”处理,但它只会返回一页数据,如果您想加载另一页 - 再做一次反应性调用。
当然在流的层面上,在接收到 10000 个对象之后,应该关闭流。这是我建议的方法。
还有另一种选择:通过一个流实现所有内容,但在这种情况下,客户端(UI 或使用分页数据的任何东西)必须“足够聪明”才能仅加载/卸载所需的数据。换句话说,如果你有 100 万个对象要显示,请考虑是否应该避免一次将所有 100 万个对象都加载到客户端的情况。
此外,页面导航会有点棘手(例如,获取下一页/上一页)。我以前没有这样工作过。我认为最重要的是,选择将是需求驱动的。
推荐阅读
- android - 如何使用 google 签名按钮确定我是否已登录或注册我的 android 应用程序
- sas - SAS 等价于 rleid 函数
- c# - Linq SelectMany 基于两个属性
- javascript - Elm,模型如何与订阅保持同步?
- python - replace() 方法不会删除空格并且 while 循环不会继续
- vba - 如何在 VBA 中将变量分配给对象属性
- python - 无法读取 pyspark 中的 mongodb 数据(json)
- apache-spark - Spark中的时间戳转换不正确
- visual-studio-code - Visual Studio Code 在 MacOS MOJAVE 上不起作用
- c++ - 如何使用导出的函数交叉编译 DLL