如何在Spring Webflux WebClient中发送“忘却”请求?

时间:2018-11-04 18:34:49

标签: 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());
}

当响应“出现”然后完成时,此代码“等待”。 (例如,调用retrieve())。但是如何不等待回应?例如,我发出请求并返回Mono.empty而不等待响应。该怎么做?

P.S。。一种在不等待响应的情况下发送请求的技术称为“发射后忘记”。

已更新

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

1 个答案:

答案 0 :(得分:1)

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

public void some(MyObject myObject) {
    return webClient.post()
            .uri("/log/my-path")
            .body(BodyInserters.fromObject(myObject))
            .retrieve()
            .bodyToMono(Void.class)
            .subscribe();
}

这有一个重要的问题:即使您对响应本身不感兴趣,您可能仍希望具有以下特定属性:

  • 在发生错误时得到通知并进行处理
  • 确保对于批处理/ 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();
}

在应用程序的其他部分,您可以再次与其他发布者链接:

Mono<Void> requestSent = some(myObject);
Mono<Other> other = requestSent.then(otherMono);