【问题标题】:Spring WebClient - chaining async callsSpring WebClient - 链接异步调用
【发布时间】:2020-07-25 03:23:52
【问题描述】:

我正在使用 Swing 构建一个普通的旧 Java 桌面应用程序,但需要对后端进行 Rest 调用。由于我们处于现代异步世界中,并且存在工具,因此我想对后端进行异步调用,显示进度条,并在调用完成时将其隐藏。

使用 Spring WebClient 似乎是可行的方法,而且效果很好,直到我需要链接多个异步 Rest 调用。在那种情况下,第二个调用永远不会响应......我看到后端确实收到了 2 个调用,但客户端永远不会恢复。

public void notWorking(CurrentTool toolDto, Consumer<ToolDto> successCallback) {
    webClient.post()
            .uri(uriBuilder -> {
                return uriBuilder
                        .path("/tools/{id}")
                        .build(toolDto.getTool().getToolId());
            })
            .body(BodyInserters.fromObject(toolDto.getTool()))
            .retrieve()
            .bodyToMono(Long.class)
            .subscribe(id -> {
                webClient.get()
                        .uri(uriBuilder -> {
                            return uriBuilder
                                    .path("/tools/{id}")
                                    .build(id);
                        })
                        .retrieve()
                        .bodyToMono(ToolDto.class)
                        .subscribe((response) -> {
                            successCallback.accept(response);
                        });
            });
}

但是,如果我以阻塞方式进行相同的调用,则一切正常。 (除了它是同步的,所以我的加载栏不会工作......)

public void working(CurrentTool toolDto, Consumer<ToolDto> successCallback) {
    Long id = webClient.post()
            .uri(uriBuilder -> {
                return uriBuilder
                        .path("/tools/{id}")
                        .build(toolDto.getTool().getToolId());
            })
            .body(BodyInserters.fromObject(toolDto.getTool()))
            .retrieve()
            .bodyToMono(Long.class)
            .block();

    webClient.get()
            .uri(uriBuilder -> {
                return uriBuilder
                        .path("/tools/{id}")
                        .build(id);
            })
            .retrieve()
            .bodyToMono(ToolDto.class)
            .subscribe((response) -> {
                successCallback.accept(response);
            });
}

【问题讨论】:

    标签: spring spring-webclient


    【解决方案1】:

    您应该尽量避免嵌套订阅。您可以改用平面地图。

    public void shouldBeWorking(CurrentTool toolDto, Consumer<ToolDto> successCallback) {
        webClient.post()
                .uri(uriBuilder -> uriBuilder
                        .path("/tools/{id}")
                        .build(toolDto.getTool().getToolId()))
                .body(BodyInserters.fromObject(toolDto.getTool()))
                .retrieve()
                .bodyToMono(Long.class)
                .flatmap(id -> webClient.get()
                        .uri(uriBuilder -> uriBuilder
                                .path("/tools/{id}")
                                .build(id))
                        .retrieve()
                        .bodyToMono(ToolDto.class))
                .subscribe(successCallback::accept);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2020-03-26
      • 1970-01-01
      相关资源
      最近更新 更多