1

这是我第一次使用 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 的角度来看,正确的实现方式是什么

任何意见,将不胜感激,

谢谢

4

1 回答 1

0

没有“正确的方法”,因为这不是一个被动的问题。

由于您正在获取“页面”,因此您正在处理一种非反应性的数据处理方式。您尚未透露有关如何获取此数据以及来自什么类型的数据库的任何信息。

最简单的事情是对数据库进行查询并一次性获取所有内容。

写一个getAllContactsForGroup而不是做一个while循环。

于 2020-02-12T17:10:38.277 回答