在 mono.compose( ) 中添加 doOnSuccess( ) 与简单的 mono.doOnSuccess( ) 有什么好处
Is there any benefit to add doOnSuccess( ) inside of mono.compose( ) vs simple mono.doOnSuccess( )
查看了 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...
}
我的线索是 compose()
与 transform()
相比每个订阅者执行一次。 doOnSuccess()
但是每个订阅者也会执行一次。
是否只是为了方便,使用 filter(...)
函数而不是内联代码?
我认为这只是为了方便,因为 filter 方法比您的代码片段建议的要长一些,并且有 doOnSuccess
和 doOnError
运算符。
这在可读性方面有几个小好处:
- 代码最好封装在filter方法中
- 调用更具可读性(在发生转换时读取)。与经典调用方法进行比较:
return filter(exchange, chain.filter(exchange))
.
但在我看来更重要的一点是 compose
是 Subscriber
特定的。因此,filter(exchange, call)
将在每次订阅时被调用。
所以开头的时序码是相关的 ;)
查看了 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...
}
我的线索是 compose()
与 transform()
相比每个订阅者执行一次。 doOnSuccess()
但是每个订阅者也会执行一次。
是否只是为了方便,使用 filter(...)
函数而不是内联代码?
我认为这只是为了方便,因为 filter 方法比您的代码片段建议的要长一些,并且有 doOnSuccess
和 doOnError
运算符。
这在可读性方面有几个小好处:
- 代码最好封装在filter方法中
- 调用更具可读性(在发生转换时读取)。与经典调用方法进行比较:
return filter(exchange, chain.filter(exchange))
.
但在我看来更重要的一点是 compose
是 Subscriber
特定的。因此,filter(exchange, call)
将在每次订阅时被调用。
所以开头的时序码是相关的 ;)