首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免使用spring webclient和flux多次调用API

避免使用spring webclient和flux多次调用API
EN

Stack Overflow用户
提问于 2020-05-27 23:53:44
回答 2查看 205关注 0票数 0

这两个调用都是客户端http api:

代码语言:javascript
运行
复制
Flux<SavingsViewFilter> views = savingsApi.getViewFilterSavings(viewId);
            Flux<Group> groups = groupsApi.getAllGroups();

并返回Flux

代码语言:javascript
运行
复制
requestBodySpec.retrieve().bodyToFlux(returnType);

我需要根据eacg view.getGroupId()中的值过滤Flux<Group>中的元素

代码语言:javascript
运行
复制
        return views.flatMap(view ->
                groups
                        .filter(group -> Objects.equals(group.getGroupId(), view.getGroupId()))
                        .flatMap(group -> Flux.just(DepositAccount.builder()
                                .agencyName(group.getGroupName())
                                .settlementAccount(view.getName())
                                .build())));

它是有效的,但问题是它正在为每个视图对象执行另一个对getAllGroups的HTTP请求。

如何避免对getAllGroups的多个请求?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-28 00:23:38

问题是,您正在为视图的每个元素订阅组。

您可以使用join来仅订阅each一次,然后逐个元素地连接。

代码语言:javascript
运行
复制
views
    //Join fluxes and create tuple for each pair
    .join(groups, s-> Flux.never(),s-> Flux.never(),Tuples::of)
    //Filter out any that don't have matching groupIds
    .filter(t -> t.getT1().getGroupId().equals(t.getT2().getGroupId()))
    //Use map, not flatMap since builder is not blocking
    .map(t -> DepositAccount.builder()
        .agencyName(t.getT2().getGroupName())
        .settlementAccount(t.getT1().getName())
        .build()
     );
票数 1
EN

Stack Overflow用户

发布于 2020-05-28 01:13:25

实际上,这不是一个正确的问题,需要仔细考虑一下。

最终结果是您尝试将viewsidsgroupsids进行匹配,并创建一个join对象。这不是Flux应用编程接口的目的。最后,看起来你试图用两个循环来完成这项任务,这是一种非常低效的方式。

如果您研究其他方法,效果会更好。

1)如果groupview都与数据库表连接,则使用SQL连接。创建高效的新终结点。

2)将一个集合放入映射中,并使用它来组合两个实体。

代码语言:javascript
运行
复制
@AllArgsConstructor
@Getter
class View {
    Integer id;
    String view;
}

@AllArgsConstructor
@Getter
class Group {
    Integer id;
    String group;
}

@Data
@AllArgsConstructor
class Combined {
    String view;
    String group;
}

private void run() {
    Flux<View> views = Flux.just(new View(1, "v1"), new View(2, "v2"), new View(3, "v3"));
    Flux<Group> groups = Flux.just(new Group(2, "g2"), new Group(3, "g3"), new Group(4, "g4"));

    views.collectMap(View::getId)
            .flatMapMany(viewMap -> groups.filter(group -> viewMap.containsKey(group.getId()))
                    .map(group ->
                            new Combined(viewMap.get(group.getId()).getView(), group.getGroup()))
            )
            .subscribe(System.out::println);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62047380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档