Reactor分页式Web服务调用

时间:2019-02-27 22:21:13

标签: java spring spring-webflux reactor

我在春季项目中使用反应堆,在这里我必须调用分页的api。 api返回如下内容:

{
  "last": false,
  "totalPages": 2,
  "totalElements": 4178,
  "sort": {
    "sorted": false,
    "unsorted": true
  },
  "first": false,
  "numberOfElements": 1178,
  "size": 3000,
  "number": 0
}

现在我要实现的是使用webflux调用服务器,直到last == true。

我不知道我们该怎么做。

到目前为止,我是这样的:

Mono<UserInfo> firstUserInfo =  panelistService.getInactiveUserInfo(noOfDays, role, pageNo);


    Flux<User> listOfUsers = firstUserInfo.flatMap(fui ->{

        logger.info("ACCOUNT SERVICE - purgeCronJob - Getting first page of inactive panelists -  page {} total {} last {} panelists {}", pageNo,fui.getTotalNoOfPages(),fui.isLast(),fui.getUserContent().size()); 

        Mono<List<User>> firstListOfUsers = Mono.just(fui.getUserContent());

        if(fui.isLast()) {
            return firstListOfUsers;
        }

        pageNo++;
        int totalPageNo = fui.getTotalNoOfPages();

        for(int i = pageNo; i < totalPageNo; i++) {

            Mono<List<User>> lou = panelistService.getInactiveUserInfo(noOfDays, role, i).map(ui ->{
                logger.info("ACCOUNT SERVICE - purgeCronJob - Getting inactive panelists -  page {} total {} last {} panelists {}", pageNo,ui.getTotalNoOfPages(),ui.isLast(),ui.getUserContent().size()); 
                return ui.getUserContent();
            }); 
            firstListOfUsers.zipWith(lou);
        }

        return firstListOfUsers;

    }).flatMapMany(Flux::fromIterable);

    listOfUsers.subscribe();

因此,我没有获取最后一个值,而是为每个页面构建了所有mono,并将它们全部压缩在一起。

2 个答案:

答案 0 :(得分:0)

我找到了一种方法,希望对其他人有所帮助。我创建了一个获取非活动帐户的方法,并递归地称为该方法。不同之处在于,现在我直接返回用户通量,并且我Flux.merge我的递归调用。

Flux<User> getInactiveUserByPage(Integer noOfDays, String role, Integer pageNo){

    return  panelistService.getInactiveUserInfo(noOfDays, role, pageNo).flatMapMany(ui ->{

        logger.info("ACCOUNT SERVICE - getInactiveUserByPage - Getting inactive panelists -  page {} total {} last {} panelists {}", pageNo,ui.getTotalNoOfPages(),ui.isLast(),ui.getUserContent().size()); 

        Flux<User> users = Flux.fromIterable(ui.getUserContent());

        if(ui.isLast()) {
            return users;
        }

        Integer newPageNo  = pageNo+1;

        Flux<User> next =  getInactiveUserByPage(noOfDays, role, newPageNo).subscribeOn(Schedulers.elastic()).mergeWith(users);

        return next;
    });

}

答案 1 :(得分:0)

您可以根据totalPages计数创建流量,在外部某个位置设置noOfDays和角色,并从第一个请求获取totalSize:

Flux.range(0,totalSize)
   .map(pageNo -> panelistService.getInactiveUserInfo(noOfDays, role, pageNo)...