簡體   English   中英

在 Spring Webflux 彈性線程中獲取請求 Object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM