Spring Reactor - потребляющая конечная точка Pageable
Я впервые работаю с Spring Reactor и столкнулся со следующей проблемой:
У меня есть служба, которая позволяет использовать ряд записей, определенных номером страницы и размером страницы:
Mono<GetContactsForGroupResponse> getContactsForGroup(Integer page, Integer size);
Среди других полей GetContactsForGroupResponse содержит метаданные разбивки на страницы:
class GetContactsForGroupResponse {
private int totalPages;
private int totalElements;
private int numberOfElements;
private int size;
private int number;
private boolean first;
private boolean last;
//.....
}
Теперь мне нужно написать другой метод, который бы считывал все страницы из
Mono<GetContactsForGroupResponse> getContactsForGroup(Integer page, Integer size);
и объединить результаты в одну коллекцию:
Mono<Collection<GetContactsForGroupResponse>> getContactsForGroup();
Пока что я написал:
List<GetContactsForGroupResponse> groupContacts = new ArrayList<>();
AtomicBoolean allPagesConsumed = new AtomicBoolean(false);
int pageNumber = 0;
int pageSize = 10;
while(!allPagesConsumed.get()) {
allPagesConsumed.set(true);
GetContactsForGroupResponse getContactsForGroupResponse =
getContactsForGroup(accountId, g.getId(), 0, pageSize).block();
Optional.ofNullable(getContactsForGroupResponse)
.ifPresent(r -> {
allPagesConsumed.set(r.isLast());
groupContacts.add(r);
});
pageNumber ++;
Я читаю результаты постранично, пока не дойду до последней страницы. Интересно, каков правильный способ реализации с точки зрения SpringReactor
Любой совет будет принят во внимание,
Спасибо
1 ответ
Нет "правильного пути", потому что это не реактивный вопрос.
Поскольку вы загружаете "страницы", вы имеете дело с нереактивным способом обработки данных. Вы не раскрыли ничего о том, как вы получаете эти данные и из какой базы данных.
Самый простой способ - просто сделать запрос к базе данных и получить все сразу.
написать getAllContactsForGroup
вместо этого, а не делайте цикл while.