研究 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/