2010-08-30 7 views
1

J'utilise Orchestra et RichFaces dans mon application. Lorsque vous accédez à une page dans ma demande, je reçois l'erreur suivante à plusieurs reprises et la page ne charge pas:Problème d'orchestre et RichFaces

WARN _ReentrantLock:103 - Waited for longer than 30000 milliseconds for access to lock [email protected] which is locked by thread http-8080-2 

Je crois au cœur du problème est un filtre que j'utilise pour l'authentification. Voici son code (conversationController est une conversation haricot scope):

@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(); 
    } 

Répondre

2

Je résolu ce problème en libérant le FacesContext avant la réponse est commise. Comme ceci:

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

Je ne comprends pas tout à fait, mais il semble que la nouvelle demande utilisait encore l'ancien FacesContext et cela interfère avec le _ReentrantLock obtenir déverrouillé.