Che*_*rry 9 java spring spring-webflux
考虑一个代码:
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());
}
Run Code Online (Sandbox Code Playgroud)
当响应“出现”然后完成时,此代码“等待”。(例如retrieve()被调用)。但如何不等待响应?例如,我提出请求并返回Mono.empty而不等待响应。怎么做?
PS发送请求而不等待响应的技术称为“即发即忘”。
更新
then都不起作用。因为他们在调用之后 bodyToMono“等待”直到 http 响应到来。例如,在bodyToMono完成之前不会调用任何(事件异步)。return语句也不起作用。可能在某些main功能中有效,但在 Spring 应用程序中无效。这不起作用,因为Mono在这种情况下刚刚创建,但没有人运行它。任何Mono诸如此类的方法map, flatMap只是功能“设置”,而不是 Mono 运行。有几种方法可以做到这一点。您可以执行以下操作:
public void some(MyObject myObject) {
return webClient.post()
.uri("/log/my-path")
.body(BodyInserters.fromObject(myObject))
.retrieve()
.bodyToMono(Void.class)
.subscribe();
}
Run Code Online (Sandbox Code Playgroud)
这有一个重要的问题:即使您对响应本身不感兴趣,您也可能希望拥有特定的属性,例如:
在这种情况下,您可以将响应与类型链接起来,该类型作为错误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();
}
Run Code Online (Sandbox Code Playgroud)
在应用程序的其他部分,您可以再次与其他发布者链接:
Mono<Void> requestSent = some(myObject);
Mono<Other> other = requestSent.then(otherMono);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5956 次 |
| 最近记录: |