Skip to content

21. Conclusión

Se han estudiado los fundamentos del framework Struts 2 y se ha presentado una aplicación que combina varias tecnologías. El lector de nivel principiante o intermedio encontrará en este documento material para formarse y progresar. Queda la necesidad de un libro de referencia. Vuelvo a recomendar la obra:

«Struts 2 in Action», escrito por Donald Brown, Chad Michael Davis y Scott Stanlick, publicado por Manning.

Me gustaría terminar exponiendo algunos problemas con los que me he encontrado al escribir los ejemplos de este documento. Ya he señalado comportamientos inesperados de Struts 2, especialmente al introducir números y fechas. A continuación, se enumeran otros problemas encontrados:

Descarguemos la aplicación [pam-01] del servidor Tomcat:

Image

La consola de Apache muestra entonces los siguientes registros:

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

La descarga se ha realizado correctamente.

Descarguemos de la misma manera [pam-02]. Los registros son entonces los siguientes:

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]; raíz de la jerarquía de fábrica
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

En las líneas 12, 14 y 16 se señalan errores graves. Dos de ellos indican una posible fuga de memoria. Efectivamente, la aplicación [pam-02] presenta fugas de memoria. Al cabo de un rato, la aplicación deja de ser utilizable. Por lo tanto, hay que cerrar NetBeans y volver a implementar la aplicación.

Todos los errores se refieren a subprocesos. La aplicación [pam-02] no utiliza subprocesos por sí misma. Por lo tanto, hay que sospechar de los marcos utilizados: Struts 2, Spring 2.5 y Tiles. Se puede descartar razonablemente a Tiles, que probablemente no gestiona subprocesos. Quedan Struts y Spring.

A continuación, realizamos otra prueba:

Implementamos la capa [web] con el framework JSF en lugar de Struts 2. No cambia nada más. Entonces obtenemos los mismos mensajes de error que con Struts 2.

Así que el culpable parece ser Spring, el pool de conexiones dbcp que utiliza aquí Spring, o bien yo mismo si no he utilizado Spring correctamente. Pude haber olvidado una configuración de Spring que permitiera limpiar los hilos creados, pude haber... La solución a este problema de fuga de memoria sigue sin encontrarse.

Otra experiencia. IDE NetBeans se instala con los servidores Tomcat y GlassFish. Intentemos ejecutar en GlassFish una aplicación creada en este documento:

  • en [2] las propiedades del proyecto [exemple-08] [1]
  • en [3], la elección del servidor web

Esta es la página recuperada en el navegador:

La portabilidad esperada no se ha producido. Aquí hay dos errores:

  • en [1], la internacionalización no ha funcionado
  • en [2], se produce una excepción

En la mayoría de las aplicaciones desarrolladas en este documento, se producen estos mismos dos errores. No he intentado resolver este nuevo problema.