[英]Getting Request Object in Spring Webflux elastic thread
我面臨一個問題。 我正在使用 Spring Webflux 並行調用一些 API。 如果任何子線程遇到任何問題,它需要記錄請求。 現在的問題是,為了記錄一個普通的 POJO class,其中有一個 static 方法,它通過 ApplicationContent 獲取一個 bean 並將數據存儲在隊列中。
現在的問題是,我想訪問請求參數,例如 Request URL / Controller 等。我試過了
ServletRequestAttributes sra =
(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
logger.error("====="+sra);
HttpServletRequest httpRequest = sra.getRequest();
但在這種情況下, sra是 null。 我嘗試添加以下代碼,
@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 .發布。
您的實施無法正常工作的原因有多種。
Webflux 與線程無關,這意味着任何線程都可以隨時處理應用程序中的任何事情。 如果應用程序發現切換當前正在執行的線程很有效,它就會這樣做。
另一方面,Servlet 應用程序為每個請求分配一個線程,並在整個執行過程中堅持使用該線程。
如您所見,ApplicationContext 使用 ServletRequests,因此它在 Webflux 應用程序中不可用。 它又使用 threadlocal 將請求 object 存儲到指定線程。
在 webflux 中,您不能使用 threadlocal,一旦應用程序切換線程,則 threadlocal 中的所有內容都消失了。 這就是為什么你會得到 null。
那么如何在線程之間傳遞數據。
您需要做的是實現一個過濾器來攔截請求,提取您想要的信息並將其放置在響應式上下文 object 中。
https://projectreactor.io/docs/core/release/reference/#context
這是解決問題的帖子。
https://developpaper.com/implementation-of-requestcontextholder-in-spring-boot-webflux/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.