gpt4 book ai didi

java - 从 RequestContext 或类似的访问 StreamListener header

转载 作者:行者123 更新时间:2023-12-02 04:48:39 28 4
gpt4 key购买 nike

我有一个服务调用了十几个其他服务。这使用 Controller 类中的 @StreamListener 来读取 Kafka 主题。出于可追溯性的目的,来自 Kafka 消息的相同 header (原始请求 ID)也需要转发到所有其他服务

传统上,使用 @PostMapping("/path")GetMapping 生成请求上下文,并且可以使用 从任何地方访问 header RequestContextHolder.currentRequestAttributes() 每当我需要进行外部调用时,我都会将 HttpHeaders 对象传递到 RequestEntity

但是在 StreamListener 中,不会生成请求上下文,并且尝试访问 RequestContextHolder 会导致异常

这是我尝试执行的操作的示例,但结果出现异常:

public class Controller {
@Autowired Service1 service1
@Autowired Service2 service2

@StreamListener("stream")
public void processMessage(Model model) {
service1.execute(model);
service2.execute(model);
}
}

public class Service {
RestTemplate restTemplate;

public void execute(Model model){
// Do some stuff

HttpHeaders httpHeaders = RequestContextHolder.currentRequestAttributes().someCodeToGetHttpHeaders();
HttpEntity<Model> request = new HttpEntity(model, httpHeaders);
restTemplate.exchange(url, HttpMethod.POST, request, String.class);
}
}

我当前的解决方法是将 StreamListener 更改为 PostMapping 并让另一个 PostMapping 调用它,以便可以生成请求上下文。另一种选择是使用 ThreadLocal,但它看起来就像 janky

我知道使用 @Headers MessageHeaders 注释来访问流 header ,但是,如果不将 header 传递给每个服务,就无法轻松访问它,并且会影响许多单元测试

理想情况下,我需要一种方法来创建自己的请求上下文(或任何正确的术语),以便有一个位置来存储请求范围的对象(HttpHeader)或其他线程安全的方法请求 header 沿着堆栈传递,而不向 service.execute

添加请求参数

最佳答案

我找到了一个解决方案,并将其留在这里供其他尝试实现类似目标的人使用

如果您的目标是通过 REST Controller 和 Stream 监听器端到端转发一堆 header ,您可能需要考虑使用 Spring Cloud Sleuth

通过 maven 或 gradle 配置将其添加到您的项目中:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

具体来说,在 Spring Cloud Sleuth 中,有一个功能可以通过在 application.properties 中设置属性 spring.sleuth.propagation-keys 来转发 header 或“行李”。这些键值对在整个跟踪中持续存在,包括也实现相同传播键的任何下游 http 或流调用

如果需要在代码级别访问这些字段,您可以使用 ExtraFieldPropagation 静态函数获取和设置它们:

ExtraFieldPropagation.set("country-code", "FO"); // Set
String countryCode = ExtraFieldPropagation.get("country-code"); // Get

请注意,ExtraFieldPropagation setter 无法设置定义的 spring.sleuth.propagation-keys 中不存在的属性,因此不会接受任意键

您可以阅读 documentation了解更多信息

关于java - 从 RequestContext 或类似的访问 StreamListener header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56460242/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com