21. Conclusión
Se han estudiado los fundamentos del marco de trabajo 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. Recomiendo nuevamente la obra:
«Struts 2 in Action», escrito por Donald Brown, Chad Michael Davis y Scott Stanlick, publicado por Manning.
Me gustaría terminar presentando algunos problemas con los que me topé al escribir los ejemplos de este documento. Ya he señalado comportamientos inesperados de Struts 2, especialmente al ingresar números y fechas. A continuación, algunos otros problemas que encontré:
Descarguemos la aplicación [pam-01] del servidor Tomcat:
La consola de Apache muestra entonces los siguientes registros:
| 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 realizó correctamente.
Desinstalemos de la misma manera [pam-02]. Los registros son 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 reportan 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 tiempo, la aplicación deja de funcionar. 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 de trabajo utilizados: Struts 2, Spring 2.5 y Tiles. Se puede descartar razonablemente a Tiles, ya que probablemente no maneja subprocesos. Quedan Struts y Spring.
Entonces realizamos otro experimento:
Implementamos la capa [web] con el marco JSF en lugar de Struts 2. No se cambia nada más. Entonces obtenemos los mismos mensajes de error que con Struts 2.
Así que el culpable parece ser Spring, el grupo de conexiones dbcp que Spring utiliza aquí, o tal vez yo mismo si no he usado Spring correctamente. Pude haber olvidado una configuración de Spring que permitiera limpiar los hilos creados, pude haber... Así que aún queda por encontrar la solución a este problema de fuga de memoria.
Otra experiencia. El IDE de 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 que se muestra en el navegador:
La portabilidad esperada no se ha logrado. Aquí hay dos errores:
- en [1], la internacionalización no funcionó
- en [2], se produce una excepción
En la mayoría de las aplicaciones desarrolladas en este documento, se presentan estos mismos dos errores. No he intentado resolver este nuevo problema.