在mono.compose()和simple mono.doOnSuccess()中添加doOnSuccess()有什么好处吗?

问题描述 投票:0回答:2

看着弹簧执行器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
2个回答
1
投票

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

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

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


1
投票

我认为这只是一个方便,因为过滤方法比你的代码片段建议的时间长一点,并且有doOnSuccessdoOnError运算符。

© www.soinside.com 2019 - 2024. All rights reserved.