- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个服务调用了十几个其他服务。这使用 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/
我想做的是收集几个请求并触发一次我的代码: RequestContext contextA =requestFactory .dataRequest().save(...).to(..
我想在导航菜单中突出显示当前页面。显然,当您在菜单链接的页面上时,我需要为菜单链接提供一个类似“事件”的类。这是一个经典问题,我见过很多解决方案proposed 。我的问题是我讨厌他们所有人,并且认为
Django RequestContext 是否有办法获取与之关联的 HttpRequest 对象?它是否有像 get_request() 之类的方法来获取传递给构造函数的 request ?我需要从
这是一个难题, 使用 Django 1.4,我无法通过消息中间件设置消息以显示在我的模板中。我梳理了Django docs并确保我的 settings.py 文件引用了相关的应用程序、上下文处理器和中
当构造函数在我的域对象之一上执行时,我需要来自 RequestContext 的数据可用。以下示例是我已经在做的事情。 public Site(IDataUniverseService dataUni
我曾在一个J2EE项目中看到过如下代码。 public class RequestContext { private final static ThreadLocal contexts = n
这个问题在这里已经有了答案: Django 'RequestContext' is not defined - forms.ModelForm (2 个答案) 关闭 7 年前。 伙计们,我是 Pyt
你好,我刚刚在 VS 中创建了一个新的 Empty webApp 并安装了 servicestack Nugets。 我正在寻找响应到内存中的缓存(通过 MemCached),但是在服务 Any 方法
使用 xsuaa approuter 登录获取登录用户对象时出现以下异常 User currentUser = UserAccessor.getCurrentUser(); 我要在不使用 GuiceF
基本上,我试图将未登录的人重定向到登录页面。 我目前使用的是: return render_to_response('login.html', context_instance=RequestCont
我有一个过滤器currency,它接受美元值并将其转换为货币(美元或英镑)。要转换为的货币存储在 session 中,但过滤器不采用 RequestContext,因此我无法直接从那里获取它。 有没有
我需要将字典和对象传递给模板。所以,我这样做 rc = RequestContext(request, {'prob':prob}, {'result':result}) return render_
我正在尝试使用 RequestContext.update() 更新表 以下代码正在工作(jsf):
Primefaces v3.5 尝试使用 RequestContext.getContext().scrollTo("") 在 ajax 请求结束时以编程方式滚动到我的表单。 XHTML 片段:
我是新来的蜜蜂,遇到了关于 Zuul 的一个问题。我首先为 Zuul 过滤器编写测试用例我想知道我是否需要为我的 Zuul 过滤器编写 UT 如果是,那么我正在编写 shouldFilter() 的单
似乎大多数文档都建议: template_values = {} template_values["foo"] = "bar" return render_to_response(path, temp
我的 7.0 之前的 Primefaces 应用程序具有以下代码: RequestContext.getCurrentInstance().execute("window.open('myUrl');
我有我的 OrganizationRequestContext 接口(interface),效果很好: @Service(OrganizationDAO.class) public interface
嗨,scala 和喷雾人! 我在从 RequestContext 中提取 HTTP“Accept” header 并对其进行匹配时遇到了一个恼人的小问题。在像这样的正常路线上: get { res
我似乎无法访问我的 Django 模板中的请求对象。 这是我的 settings.py 文件的一部分: import django.conf.global_settings as DEFAULT_SE
我是一名优秀的程序员,十分优秀!