Only call exchange filter function methods when context is ready; fixes gh-2062

This commit is contained in:
Marcin Grzejszczak
2021-11-29 09:54:22 +01:00
parent efe83a0936
commit 65fb46bc1b

View File

@@ -38,6 +38,7 @@ import org.springframework.cloud.sleuth.http.HttpClientRequest;
import org.springframework.cloud.sleuth.http.HttpClientResponse;
import org.springframework.cloud.sleuth.instrument.reactor.ReactorSleuth;
import org.springframework.cloud.sleuth.instrument.reactor.TraceContextPropagator;
import org.springframework.cloud.sleuth.internal.ContextUtil;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.http.HttpMethod;
import org.springframework.web.reactive.function.client.ClientRequest;
@@ -70,11 +71,32 @@ public final class TraceExchangeFilterFunction implements ExchangeFilterFunction
}
public static ExchangeFilterFunction create(ConfigurableApplicationContext springContext) {
return new TraceExchangeFilterFunction(springContext);
return new ExchangeFilterFunction() {
TraceExchangeFilterFunction traceExchangeFilterFunction;
@Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
if (ContextUtil.isContextUnusable(springContext)) {
return next.exchange(request);
}
return traceExchangeFilterFunction().filter(request, next);
}
private TraceExchangeFilterFunction traceExchangeFilterFunction() {
if (this.traceExchangeFilterFunction == null) {
this.traceExchangeFilterFunction = new TraceExchangeFilterFunction(springContext);
}
return this.traceExchangeFilterFunction;
}
};
}
@Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
if (ContextUtil.isContextUnusable(this.springContext)) {
return next.exchange(request);
}
return new MonoWebClientTrace(next, request, this);
}