看着弹簧执行器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(...)
函数而不是内联代码?
这在可读性方面有几个小的好处:
return filter(exchange, chain.filter(exchange))
。但在我看来,更重要的一点是compose
是Subscriber
特有的。因此,每次订阅都会调用filter(exchange, call)
。因此,开头的时间码将是相关的;)
我认为这只是一个方便,因为过滤方法比你的代码片段建议的时间长一点,并且有doOnSuccess
和doOnError
运算符。