Есть ли какая-либо выгода для добавления doOnSuccess () внутри mono.compose () по сравнению с простой mono.doOnSuccess () - PullRequest
0 голосов
/ 30 августа 2018

Заглянул в пружинный привод 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 голосов
/ 31 августа 2018

Это имеет несколько небольших преимуществ с точки зрения читабельности:

  • код лучше инкапсулирован в методе фильтра
  • вызов более читабелен (читается по мере преобразования). сравните с классическим вызовом метода: return filter(exchange, chain.filter(exchange)).

Но, на мой взгляд, более важным моментом является то, что compose является Subscriber -специфичным. Как следствие, filter(exchange, call) будет вызываться при каждой подписке. И, таким образом, временной код в начале будет иметь отношение ;)

0 голосов
/ 30 августа 2018

Я думаю, что это просто удобство, так как метод фильтра немного длиннее, чем предлагает ваш фрагмент кода, и есть как doOnSuccess, так и doOnError операторы.

...