1

我在我的应用程序中使用 Orchestra 和 RichFaces。在我的应用程序中访问页面时,我多次收到以下错误并且页面未加载:

WARN _ReentrantLock:103 - Waited for longer than 30000 milliseconds for access to lock org.apache.myfaces.orchestra.lib._ReentrantLock@78214f6b which is locked by thread http-8080-2

我相信问题的核心是我用于身份验证的过滤器。这是它的代码(conversationController 是一个会话范围的 bean):

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain)
    throws IOException, ServletException
    {           
        FacesContextBuilder builder = new FacesContextBuilder();

        FacesContext facesContext = builder.getFacesContext(request, response);
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
        Application application = facesContext.getApplication();
        ELContext elContext = facesContext.getELContext();
        ConversationController conversationController = (ConversationController) application.getELResolver().getValue(elContext, null, "conversationController");
        SessionController sessionController = (SessionController) application.getELResolver().getValue(elContext, null, "sessionController");
        ApplicationController applicationController = (ApplicationController) application.getELResolver().getValue(elContext, null, "applicationController");
        EntityRegistry entityRegistry = conversationController.getEntityRegistry();     

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse= (HttpServletResponse) response;

        User currentUser = sessionController.getCurrentUser();

        Boolean isTesting = (Boolean) servletContext.getAttribute("ginger.TESTING");
        if (isTesting == null) isTesting = false;

        if (currentUser == null)
        {
            if (httpRequest.isSecure() || isTesting)
            {               
                Cookie[] cookies = httpRequest.getCookies();
                Cookie cookie = null;

                if (cookies != null)
                {
                    for (int i=0; i<cookies.length; i++)
                    {
                        if (cookies[i].getName().equals("ginger.USERCOOKIE"))
                        {
                            cookie = cookies[i];
                            break;
                        }
                    }
                }

                if (cookie != null)
                {
                    currentUser = entityRegistry.getUserByCookie(cookie.getValue()); 
                }

                if (currentUser == null)
                {
                    currentUser = new UnregisteredUser();

                    String cookieValue = String.valueOf(applicationController.getRandom());

                    currentUser.setCookie(cookieValue);

                    entityRegistry.storeUser(currentUser);

                    cookie = new Cookie("ginger.USERCOOKIE", cookieValue);
                    cookie.setPath(applicationController.getPath());
                    cookie.setMaxAge(365*24*60*60);
                    if (!isTesting) cookie.setSecure(true);

                    httpResponse.addCookie(cookie);
                }

                sessionController.setCurrentUser(currentUser);

                @SuppressWarnings("unchecked")
                String url = URLConstructor.constructUrl(servletContext, httpRequest, httpResponse, false, httpRequest.getRequestURI(), httpRequest.getParameterMap());

                httpResponse.sendRedirect(url);
            }
            else
            {
                @SuppressWarnings("unchecked")
                String url = URLConstructor.constructUrl(servletContext, httpRequest, httpResponse, true, httpRequest.getRequestURI(), httpRequest.getParameterMap());

                httpResponse.sendRedirect(url);
            }
        }
        else
        {
            chain.doFilter(request, response);
        }

        builder.removeFacesContext();
    }
4

1 回答 1

2

我通过在提交响应之前释放 FacesContext 解决了这个问题。像这样:

@SuppressWarnings("unchecked")
String url = URLConstructor.constructUrl(servletContext, httpRequest, httpResponse, true, httpRequest.getRequestURI(), httpRequest.getParameterMap());
builder.removeFacesContext();
httpResponse.sendRedirect(url);

我不完全理解这一点,但似乎新请求仍在使用旧的 FacesContext,这干扰了 _ReentrantLock 的解锁。

于 2010-08-31T13:36:05.630 回答