gpt4 book ai didi

spring-webflux - 在 Spring Webflux 弹性线程中获取请求对象

转载 作者:行者123 更新时间:2023-12-05 02:08:05 30 4
gpt4 key购买 nike

我面临一个问题。我正在使用 Spring Webflux 并行调用一些 API。如果任何子线程面临任何问题,它需要记录请求。现在的问题是,用于记录一个普通的 POJO 类,其中有一个静态方法通过 ApplicationContent 获取 bean 并将数据存储在队列中。

现在的问题是,我想访问请求参数,例如请求 URL/ Controller 等。我试过了

ServletRequestAttributes sra = 
(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
logger.error("====="+sra);
HttpServletRequest httpRequest = sra.getRequest();

但在这种情况下,sra 为空。我尝试添加以下代码,

@Configuration
public class InheritableRequestContextListener extends RequestContextListener {
private static final String REQUEST_ATTRIBUTES_ATTRIBUTE =
InheritableRequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";

@Override
public void requestInitialized(ServletRequestEvent requestEvent) {
System.out.println("111111111111111111");
if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
throw new IllegalArgumentException(
"Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
}
HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
RequestContextHolder.setRequestAttributes(attributes, true);
}
}

但这并没有帮助。谁能帮忙。我正在使用 springboot 版本; 2.0.2.RELEASE

最佳答案

您的实现不起作用的原因有多种。

Webflux 与线程无关,这意味着任何线程都可以在应用程序中随时处理任何事情。如果应用程序发现切换当前执行线程很有效,它就会这样做。

另一方面,Servlet 应用程序为每个请求分配一个线程,并在整个执行过程中坚持使用该线程。

如您所见,ApplicationContext 使用 ServletRequests,因此它在 Webflux 应用程序中不可用。它又使用 threadlocal 将请求对象存储到指定的线程。

在 webflux 中,您不能使用 threadlocal,因为一旦应用程序切换线程,threadlocal 中的所有内容都消失了。这就是为什么你得到 null。

那么如何在线程之间传递数据。

您需要做的是实现一个拦截请求的过滤器,提取您想要的信息并将其放置在响应式上下文对象中。

https://projectreactor.io/docs/core/release/reference/#context

这是解决问题的帖子。

https://developpaper.com/implementation-of-requestcontextholder-in-spring-boot-webflux/

关于spring-webflux - 在 Spring Webflux 弹性线程中获取请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61251860/

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