看过弹簧执行器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(...)
函数代替内联代码只是为了方便吗?
答案 0 :(得分:1)
我认为这很方便,因为过滤方法比您的代码段所建议的更长,并且同时有doOnSuccess
和doOnError
运算符。
答案 1 :(得分:1)
这在可读性方面有几个小好处:
return filter(exchange, chain.filter(exchange))
。但我认为更重要的一点是compose
是Subscriber
特定的。因此,filter(exchange, call)
将在每个订阅上被调用。
因此开头的计时代码将是重要的;)