Introduction à STRUTS2 par l'exemple


précédentsommaire

XXI. Conclusion

Les bases du framework Struts 2 ont été étudiées et une application réunissant plusieurs technologies a été présentée. Le lecteur de niveau débutant ou intermédiaire trouvera dans ce document matière à se former et à progresser. Reste le besoin d'un livre de référence. Je conseille de nouveau l'ouvrage :

Struts 2 in Action " écrit par Donald Brown - Chad Michael Davis - Scott Stanlick aux éditions Manning.

Je voudrais terminer en présentant des problèmes que j'ai rencontrés lors de l'écriture des exemples de ce document. J'ai déjà signalé des comportements inattendus de Struts 2, notamment lors des saisies de nombres et de dates. Voici quelques autres problèmes rencontrés :

Déchargeons l'application [pam-01] du serveur Tomcat :

Image non disponible

La console d'Apache affiche alors les logs suivants :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
janv. 05, 2012 11:18:58 AM org.springframework.context.support.AbstractApplicationContext doClose
Infos: Closing org.springframework.web.context.support.XmlWebApplicationContext@57488b9c: display name [Root WebApplicationContext]; startup date [Thu Jan 05 11:18:45 CET 2012]; root of context hierarchy
janv. 05, 2012 11:18:58 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
Infos: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@78ae9d8d: defining beans [config,metier]; root of factory hierarchy
janv. 05, 2012 11:18:58 AM org.apache.tiles.access.TilesAccess setContainer
Infos: Removing TilesContext for context: org.apache.catalina.core.ApplicationContextFacade
janv. 05, 2012 11:19:00 AM org.apache.catalina.startup.HostConfig checkResources
Infos: Repli (undeploy) de l'application web ayant pour chemin de contexte /pam-01

Le déchargement s'est bien passé.

Déchargeons de la même façon [pam-02]. Les logs sont alors les suivants :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
janv. 05, 2012 11:21:07 AM org.springframework.context.support.AbstractApplicationContext doClose
Infos: Closing org.springframework.web.context.support.XmlWebApplicationContext@5d9131fa: display name [Root WebApplicationContext]; startup date [Thu Jan 05 11:11:10 CET 2012]; root of context hierarchy
janv. 05, 2012 11:21:07 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
Infos: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7b66d238: defining beans [config,metier,employeDao,indemniteDao,cotisationDao,entityManagerFactory,dataSource,org. /
springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework./
transaction.config.internalTransactionAdvisor,txManager,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0]; root of factory hierarchy
janv. 05, 2012 11:21:07 AM org.springframework.orm.jpa.AbstractEntityManagerFactoryBean destroy
Infos: Closing JPA EntityManagerFactory for persistence unit 'pam-PU'
janv. 05, 2012 11:21:07 AM org.hibernate.impl.SessionFactoryImpl close
Infos: closing
janv. 05, 2012 11:21:07 AM org.apache.tiles.access.TilesAccess setContainer
Infos: Removing TilesContext for context: org.apache.catalina.core.ApplicationContextFacade
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
Grave: The web application [/pam-02] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Grave: The web application [/pam-02] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
janv. 05, 2012 11:21:07 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Grave: The web application [/pam-02] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
janv. 05, 2012 11:21:08 AM org.apache.catalina.startup.HostConfig checkResources
Infos: Repli (undeploy) de l'application web ayant pour chemin de contexte /pam-02

Lignes 12, 14, 16, des erreurs graves sont signalées. Deux d'entre elles signalent une possibilité de fuite mémoire. Effectivement, l'application [pam-02] présente des fuites mémoire. Au bout d'un moment, l'application n'est plus utilisable. Il faut alors fermer Netbeans et redéployer l'application.

Les erreurs se réfèrent toutes à des threads. L'application [pam-02] n'en utilise pas par elle-même. Il faut donc soupçonner les frameworks utilisés Struts 2, Spring 2.5, Tiles. On peut raisonnablement exclure Tiles qui probablement ne gère pas de threads. Restent Struts et Spring.

On fait alors une autre expérience :

Image non disponible

On implémente la couche [web] avec le framework JSF au lieu de Struts 2. Rien d'autre ne change. On a alors les mêmes messages d'erreur qu'avec Struts 2.

Donc le fautif semble être Spring, le pool de connexions dbcp utilisé ici par Spring ou bien moi-même si je n'ai pas utilisé Spring à bon escient. J'ai pu oublier une configuration de Spring qui permettrait de nettoyer les threads créés, j'ai pu ... La solution à ce problème de fuite mémoire reste donc à trouver.

Autre expérience. L'IDE Netbeans s'installe avec les serveurs Tomcat et Glassfish. Essayons d'exécuter sur Glassfish une application créée dans ce document :

Image non disponible

  • en [2] les propriétés du projet [exemple-08] [1]
  • en [3], le choix du serveur web

Voici la page récupérée dans le navigateur :

Image non disponible

La portabilité attendue n'est pas au rendez-vous. Il y a ici deux erreurs :

  • en [1], l'internationalisation n'a pas marché
  • en [2], on a une exception

Pour la plupart des applications développées dans ce document, on a ces mêmes deux erreurs. Je n'ai pas cherché à résoudre ce nouveau problème.


précédentsommaire

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2012 Serge Tahe. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.