【问题标题】:Is there any benefit to add doOnSuccess( ) inside of mono.compose( ) vs simple mono.doOnSuccess( )在 mono.compose() 中添加 doOnSuccess() 与简单的 mono.doOnSuccess() 有什么好处吗
【发布时间】:2018-08-30 01:27:12
【问题描述】:

查看了 Spring Actuator 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(...)函数而不是内联代码?

【问题讨论】:

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


    【解决方案1】:

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

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

    但在我看来,更重要的是compose 是Subscriber 特有的。因此,每个订阅都会调用filter(exchange, call)。 因此开头的计时码是相关的 ;)

    【讨论】:

      【解决方案2】:

      我认为这只是一种方便,因为过滤方法比您的代码 sn-p 建议的要长一些,并且有 doOnSuccess 和 doOnError 运算符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2019-09-22
        • 2014-02-27
        • 1970-01-01
        • 2019-01-18
        相关资源
        最近更新 更多