2010-10-29 29 views
0

J'ai développé un site Web en utilisant Struts2 comme contrôleur et l'ai intégré avec Spring et Hibernate pour faire la logique métier et les choses DB. Les URI du site sont: http://my.domian.com/URI; lequel {URI} est généré dynamiquement à partir des cms d'administration. La cartographie de chaque uri au servlet sont faites avec l'aide d'Apache mod_rewrite, comme suit: (Avant toute information complémentaire, est-ce une bonne approche et appropriée)Classe d'action unique pour plusieurs URI dynamiques jette une exception lors de la demande simultanée

RewriteCond %{HTTP_HOST} ^www\.domain\.com 
RewriteRule ^([a-zA-Z0-9_-]+)$ /dynamic\.action?f=$1 [QSA,L] 

La configuration des entretoises est juste un typiquement académique:

<package name="Default" extends="struts-default" namespace="/"> 
    ... 
    <action name="dynamic" class="DynamicContentAction"> 
     <result name="index">/content/web/dynamic/index.jsp</result> 
    </action> 
</package> 

DynamicContentAction prolonge ActionSupport et la mise en œuvre ServletRequestAware, ServletContextAware. Je vérifie un certain nombre de choses (comme une langue de visite actuelle identifiée comme sous-domaine), recherchant dans la base de données que l'uri demandé est valide ou non, générant le contenu de cet uri et définissant quelques variables globales d'exécution (tel que l'ID de la page en cours de visite, la configuration de la mise en page en raison de la langue de visite en cours ...) et placez-la sur un objet Request dans cette servlet.

Tout va bien et fonctionne même parfaitement, à moins que trop de pages dynamiques ne soient demandées simultanément par un seul utilisateur. "Trop" dans mon cas est d'au moins 9-10 pages. Dans ce cas il jette des exceptions, différentes! Parfois, la requête HttpServletRequest est nulle, parfois ServletContext servletContext est null, d'autres fois, elles sont correctes, mais les variables d'exécution sont nulles, ce qui est utilisé dans la logique métier ou l'interrogation db. J'ai recherché sur google à ce sujet et j'ai découvert que cette action est instanciée "par demande". N'est-ce pas? S'il y a une action par requête, quel est le problème avec ce conflit ou "chose de nullité". Est-ce que je devrais faire quelque chose comme un fil dans cette action, au-delà du filetage des entretoises?

Je serais tellement apprécié si vous pouviez m'aider ou me montrer une direction.

Répondre

0

version est ici simplifiée de DynamicContentAction.java

public class DynamicContentAction extends ActionSupport implements ServletRequestAware, ServletContextAware { 
    private HttpServletRequest request; 
    private ServletContext servletContext; 

    private ResourceSelectorService resourceSelectorService; 

    private String f = null; 

    public String execute() { 
     if (f != null) { 
      HashMap<String, Object> resolvedURI = resourceSelectorService.resolveURI(f); 

      if (resolvedURI.get("ERROR").equals(true)) { 
       //Generating nice 404 error page content 
      } else { 
       //Generating Content 
       //and put it on request object as: 
       //request.setAttribute("attrName", resourceContent); 
      } 
     } 

     else { 
      //Generating nice 404 error page content 
     } 

     request = null; 
     servletContext = null; 

     f = null; 

     return "index"; 
    } 

    @Override 
    public void setServletRequest(HttpServletRequest request) { 
     this.request = request; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 

    public void setF(String f) { 
     this.f = f; 
    } 

    public String getF() { 
     return f; 
    } 
} 

que je vous écris ce post, je suis venu à la connaissance que cette classe est pas thread-safe. Est-ce? J'ai donc changé un peu comme suit:

Voici la version plus récente de DynamicContentAction.java

public class DynamicContentAction extends ActionSupport { 
    private ResourceSelectorService resourceSelectorService; 

    private String f = null; 

    public String execute() { 
     if (f != null) { 
      final HttpServletRequest request = ServletActionContext.getRequest(); 
      final ServletContext servletContext = ServletActionContext.getServletContext(); 

      HashMap<String, Object> resolvedURI = resourceSelectorService.resolveURI(f); 

      if (resolvedURI.get("ERROR").equals(true)) { 
       //Generating nice 404 error page content 
      } else { 
       //Generating Content 
       //and put it on request object as: 
       //request.setAttribute("attrName", resourceContent); 
      } 
      f = null; 
     } 

     else { 
      //Generating nice 404 error page content 
     } 

     return "index"; 
    } 

    public void setF(String f) { 
     this.f = f; 
    } 

    public String getF() { 
     return f; 
    } 
} 

et le problème de chose Null est presque disparu, mais il reste encore en conflit avec le contenu généré. Par exemple, si l'utilisateur essaie d'ouvrir:

http: // www.domain.com/A
http: // www.domain.com/B
http: // www.domain.com/C
http: // www.domain.com/D
http: // www.domain.com/E

simultanément, toutes les pages seront affichées dans le navigateur, mais le contenu de A est indiqué dans A et B , C est correct, et il y a de très fortes chances que le contenu de D et E soit également incorrect.