Java反应式编程中的分页

时间:2018-09-22 08:00:53

标签: java reactive-programming project-reactor

我在Java反应性编程方面还是一个新手,我的项目要求要我在Java中使用反应性编程实现分页。

就像我点击了一个API,该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]

我不能在这里使用Page inteface,因为它正在阻塞,所以有什么办法可以解决此问题?

1 个答案:

答案 0 :(得分:6)

我还没有使用spring-webflux,因此我无法评论特定的API调用,但是我将提供一个“理论上的”答案,也可能会有所帮助。

磁通表示数据流(可能是无限的)。因此,分页与反应性并不一致,只是因为他们在谈论不同的事情

请考虑在根据您的要求返回(逻辑上确定的)最多10000条记录的Flux的方法中使用输入参数(如通常的限制/偏移量)实现分页。

因此,将以“响应方式”处理一个调用,但如果您要加载另一页,则它将仅返回一页数据-进行另一响应调用。

当然,在流级别,接收到10000个对象后,应关闭流。 这是我建议的方法。

还有另一种选择:通过一个流实现所有内容,但是在这种情况下,客户端(UI或使用分页数据的任何对象)必须“足够聪明”才能仅加载/卸载所需的数据。换句话说,如果您拥有全部,比如说要显示100万个对象,请考虑是否应该避免一次将所有100万个对象同时加载到客户端的情况。

此外,页面导航会有些棘手(类似于下一页/上一页)。我以前没有这样工作过。我认为最重要的是,选择将取决于需求。