java - 在 mono.compose() 内部添加 doOnSuccess() 与简单的 mono.doOnSuccess() 有什么好处

标签 java reactive-programming spring-webflux project-reactor spring-boot-actuator

研究 Spring 执行器MetricsWebFilter

看到了这段代码:

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return chain.filter(exchange).compose((call) -> filter(exchange, call));
}

private Publisher<Void> filter(ServerWebExchange exchange, Mono<Void> call) {
    long start = System.nanoTime();
    ServerHttpResponse response = exchange.getResponse();
    return call.doOnSuccess((done) -> success(exchange, start))
    ... more code ...
}

如果没有 compose() 映射会有什么不同吗?

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return chain.filter(exchange).doOnSuccess( ... ) ... more code...
}

我的线索是,与 transform() 相比,compose() 对每个订阅者执行一次。然而,doOnSuccess() 也会为每个订阅者执行一次。

使用 filter(...) 函数而不是内联代码只是为了方便吗?

最佳答案

这在可读性方面有几个小好处:

  • 代码更好地封装在过滤器方法中
  • 调用更具可读性(在发生转换时读取)。与传统调用该方法相比:return filter(exchange, chain.filter(exchange))

但在我看来,更重要的一点是 compose 是特定于订阅者的。因此,filter(exchange, call) 将在每个订阅上调用。 因此开头的计时代码将是相关的;)

关于java - 在 mono.compose() 内部添加 doOnSuccess() 与简单的 mono.doOnSuccess() 有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52088047/

相关文章:

spring-boot - 使用Webflux和Spring Cloud时如何将tomcat替换为netty?

kotlin - Spring WebFlux,提取请求正文

java - 在 groovy 中切片字符串

java - 表格 :form tag declares that it accepts dynamic attributes but does not implement the required interface

Java NoSuchMethodError 相同的类名

c# - RX - 重新抛出包含方法的错误

java - 使用 Java 配置将 Spring MVC 拦截器绑定(bind)到 URL

rxjs - 从生产者端取消 Observable,而不是消费者端

system.reactive - 为什么我需要在完成后处理订阅?

java - 如何覆盖任何 HttpHeader 以响应 WebClient?