Я использую реактор в весеннем проекте, где мне нужно вызвать API с разбивкой на страницы. API возвращает что-то вроде этого:
{
"last": false,
"totalPages": 2,
"totalElements": 4178,
"sort": {
"sorted": false,
"unsorted": true
},
"first": false,
"numberOfElements": 1178,
"size": 3000,
"number": 0
}
Теперь я пытаюсь добиться использования webflux для вызова сервера до последнего == 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();
Поэтому вместо того, чтобы получать последнее значение, я создаю все моно для каждой страницы и сжимаю их все вместе.