Spring Reactor - потребляющий конечную точку Pageable - PullRequest
1 голос
/ 12 февраля 2020

Я впервые работаю с 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 Ответ

0 голосов
/ 12 февраля 2020

нет «правильного пути», потому что это не реактивный вопрос.

Поскольку вы выбираете «страницы», вы имеете дело с нереактивным способом обработки данных. Вы не раскрыли ничего о том, как вы извлекаете эти данные и из какого типа базы данных.

Самое простое - просто сделать запрос к базе данных и получить все в одной go.

вместо этого напишите getAllContactsForGroup, а не делайте пока l oop.

...