如何在spring webflux webclient中发送“即发即忘”请求?

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发送请求而不等待响应的技术称为“即发即忘”。

更新

  1. 任何单声道功能then都不起作用。因为他们在调用之后 bodyToMono“等待”直到 http 响应到来。例如,在bodyToMono完成之前不会调用任何(事件异步)。
  2. “删除”return语句也不起作用。可能在某些main功能中有效,但在 Spring 应用程序中无效。这不起作用,因为Mono在这种情况下刚刚创建,但没有人运行它。任何Mono诸如此类的方法map, flatMap只是功能“设置”,而不是 Mono 运行。

Bri*_*zel 8

有几种方法可以做到这一点。您可以执行以下操作:

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)

这有一个重要的问题:即使您对响应本身不感兴趣,您也可能希望拥有特定的属性,例如:

  • 出现错误时收到通知并进行处理
  • 确保在批处理/CLI 应用程序的情况下,某些东西会保留该请求并阻止您的应用程序退出,认为一切都已完成

在这种情况下,您可以将响应与类型链接起来,该类型作为错误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)