在 mono.compose( ) 中添加 doOnSuccess( ) 与简单的 mono.doOnSuccess( ) 有什么好处

Is there any benefit to add doOnSuccess( ) inside of mono.compose( ) vs simple mono.doOnSuccess( )

查看了 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...
}

我的线索是 compose()transform() 相比每个订阅者执行一次。 doOnSuccess() 但是每个订阅者也会执行一次。

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

我认为这只是为了方便,因为 filter 方法比您的代码片段建议的要长一些,并且有 doOnSuccessdoOnError 运算符。

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

  • 代码最好封装在filter方法中
  • 调用更具可读性(在发生转换时读取)。与经典调用方法进行比较:return filter(exchange, chain.filter(exchange)).

但在我看来更重要的一点是 composeSubscriber 特定的。因此,filter(exchange, call) 将在每次订阅时被调用。 所以开头的时序码是相关的 ;)