问题描述
我正在构建一个使用 spring 集成和 spring sleuth 的 springboot 应用程序。该应用程序从 csv 文件中读取,对于 csv 文件中的每条记录,都会使用 spring resttemplate 调用 API。每次读取文件时,对 API 的所有相应调用都具有相同的 X-B3-TraceId。它们确实有不同的 spanId。
我希望每次调用 API 时都有不同的 X-B3-TraceId。我相信 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" 使用 resttemplate as 调用 API,
ResponseEntity<String> response = restTemplate.exchange(someUrl,HttpMethod.POST,requestEntity,String.class);
我尝试手动设置 X-B3-TraceId 标头,但这似乎被覆盖了
解决方法
如果您想用自己的值覆盖某些标头,则应在 IntegrationFlow
中使用类似的内容:
.enrichHeaders(s -> s.header("X-B3-TraceId","some_value",true))
最后一个参数在这里很重要,设置为 true
。
查看它的 JavaDocs:
@param overwrite true to overwrite an existing header.
另一方面,您的代码片段并不清楚 X-B3-TraceId
标头是如何出现在消息中的。谁给我们定的?您的文件读取器和记录拆分器在哪里?