#spring-boot #spring-integration #resttemplate #spring-cloud-sleuth #zipkin
#spring-boot #spring-интеграция #resttemplate #spring-cloud-sleuth #zipkin
Вопрос:
Я создаю приложение springboot, которое также использует spring integration и spring sleuth. Приложение считывает данные из файла csv, и для каждой записи в файле csv выполняется вызов API с использованием spring resttemplate. Каждый раз, когда файл считывается, все соответствующие вызовы API имеют один и тот же X-B3-traceId. У них другой spanId.
Я хотел бы иметь разные X-B3-traceId для каждого вызова API. Я считаю, что интеграция spring устанавливает traceId для каждой операции чтения файла и использует его повсюду во время каждого вызова API.
@Bean
public IntegrationFlow bridgeFlow() {
return IntegrationFlows.from(ABC_SERVICE_QUEUE_CHANNEL)
.bridge(e -> e.poller(Pollers.fixedDelay(period).maxMessagesPerPoll(MAX_MSG_PER_POLL)))
.handle(someService, "someMethod")
.route(router())
.get();
}
«someMethod» вызывает API с использованием resttemplate как,
ResponseEntity<String> response = restTemplate.exchange(someUrl, HttpMethod.POST, requestEntity, String.class);
Я попытался вручную установить заголовки X-B3-traceId, но, похоже, они переопределяются
Комментарии:
1. какую версию Sleuth вы используете?
Ответ №1:
Если вы хотите переопределить какой-либо заголовок своим собственным значением, вам следует использовать что-то подобное в вашем IntegrationFlow
:
.enrichHeaders(s -> s.header("X-B3-TraceId", "some_value", true))
Здесь важно установить значение последнего аргумента true
.
Посмотрите его JavaDocs:
@param overwrite true to overwrite an existing header.
С другой стороны, из вашего фрагмента кода неясно, как этот X-B3-TraceId
заголовок вообще появляется в сообщении. Кто устанавливает его для нас? А где ваш файловый ридер и разделитель для записей в нем?