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.

Другие вопросы по тегам