【发布时间】: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);
});
}
【问题讨论】: