与简单的mono.doOnSuccess()相比,在mono.compose()内添加doOnSuccess()有什么好处吗?

时间:2018-08-30 01:27:12

标签: java reactive-programming spring-webflux project-reactor spring-boot-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(...)函数代替内联代码只是为了方便吗?

2 个答案:

答案 0 :(得分:1)

我认为这很方便,因为过滤方法比您的代码段所建议的更长,并且同时有doOnSuccessdoOnError运算符。

答案 1 :(得分:1)

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

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

但我认为更重要的一点是composeSubscriber特定的。因此,filter(exchange, call)将在每个订阅上被调用。 因此开头的计时代码将是重要的;)