考虑一个代码:
private WebClient webClient;
public void some(MyObject myObject) {
return webClient.post()
.uri("/log/my-path")
.body(BodyInserters.fromObject(myObject))
.retrieve()
.bodyToMono(Void.class)
.subscribeOn(Schedulers.single());
}
当响应“出现”然后完成时,此代码“等待”。 (例如,调用retrieve()
)。但是如何不等待回应?例如,我发出请求并返回Mono.empty
而不等待响应。该怎么做?
P.S。。一种在不等待响应的情况下发送请求的技术称为“发射后忘记”。
已更新
then
之类的单声道功能均不起作用。因为他们在之后 bodyToMono
发出了呼吁,因此“等待”直到HTTP响应即将到来。例如。在bodyToMono
完成之前,不会调用(事件异步)。return
语句也不起作用。可能在某些main
函数中有效,但在Spring应用程序中无效。这不会生效,因为Mono
只是在这种情况下创建的,但是没有人运行它。 Mono
之类的任何map, flatMap
方法都只是功能“设置”,而不是Mono运行。答案 0 :(得分:1)
有几种方法可以做到这一点。 您可以执行以下操作:
public void some(MyObject myObject) {
return webClient.post()
.uri("/log/my-path")
.body(BodyInserters.fromObject(myObject))
.retrieve()
.bodyToMono(Void.class)
.subscribe();
}
这有一个重要的问题:即使您对响应本身不感兴趣,您可能仍希望具有以下特定属性:
在这种情况下,您可以使用Mono<Void>
类型(以Mono.empty()
或错误完成)链接响应:
public Mono<Void> some(MyObject myObject) {
return webClient.post()
.uri("/log/my-path")
.body(BodyInserters.fromObject(myObject))
.retrieve()
.bodyToMono(Void.class)
.then();
}
在应用程序的其他部分,您可以再次与其他发布者链接:
Mono<Void> requestSent = some(myObject);
Mono<Other> other = requestSent.then(otherMono);