我在春季项目中使用反应堆,在这里我必须调用分页的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,并将它们全部压缩在一起。
答案 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)...