21. Conclusione
Sono state esaminate le basi del framework Struts 2 ed è stata presentata un'applicazione che integra diverse tecnologie. Il lettore di livello principiante o intermedio troverà in questo documento spunti per formarsi e progredire. Rimane la necessità di un libro di riferimento. Consiglio nuovamente l'opera:
"Struts 2 in Action" scritto da Donald Brown, Chad Michael Davis e Scott Stanlick, edito da Manning.
Vorrei concludere presentando alcuni problemi che ho riscontrato durante la stesura degli esempi contenuti in questo documento. Ho già segnalato alcuni comportamenti inaspettati di Struts 2, in particolare durante l’inserimento di numeri e date. Ecco alcuni altri problemi riscontrati:
Scarichiamo l’applicazione [pam-01] dal server Tomcat:
La console di Apache visualizza quindi i seguenti log:
| 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
|
Lo scaricamento è andato a buon fine.
Rimuoviamo allo stesso modo [pam-02]. I log sono quindi i seguenti:
| 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]; radice della gerarchia di fabbrica
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
|
Alle righe 12, 14 e 16 vengono segnalati errori gravi. Due di essi indicano una possibile perdita di memoria. Effettivamente, l'applicazione [pam-02] presenta perdite di memoria. Dopo un po' di tempo, l'applicazione non è più utilizzabile. È quindi necessario chiudere NetBeans e ridistribuire l'applicazione.
Gli errori si riferiscono tutti ai thread. L’applicazione [pam-02] non ne utilizza di propria iniziativa. È quindi lecito sospettare che la causa risieda nei framework utilizzati: Struts 2, Spring 2.5 e Tiles. Si può ragionevolmente escludere Tiles, che probabilmente non gestisce i thread. Restano Struts e Spring.
Si esegue quindi un altro esperimento:
Implementiamo il livello [web] utilizzando il framework JSF al posto di Struts 2. Nient’altro cambia. Si ottengono quindi gli stessi messaggi di errore che si verificavano con Struts 2.
Quindi il responsabile sembra essere Spring, il pool di connessioni dbcp qui utilizzato da Spring, oppure io stesso se non ho utilizzato Spring in modo corretto. Potrei aver tralasciato una configurazione di Spring che consentirebbe di liberare i thread creati, potrei aver... La soluzione a questo problema di perdita di memoria resta quindi da trovare.
Altra esperienza. IDE NetBeans si installa con i server Tomcat e GlassFish. Proviamo a eseguire su GlassFish un’applicazione creata in questo documento:
- in [2] le proprietà del progetto [exemple-08] [1]
- in [3], la scelta del server web
Ecco la pagina visualizzata nel browser:
La portabilità prevista non è stata raggiunta. Ci sono due errori:
- in [1], l'internazionalizzazione non ha funzionato
- in [2], si verifica un'eccezione
Per la maggior parte delle applicazioni sviluppate in questo documento, si riscontrano questi stessi due errori. Non ho cercato di risolvere questo nuovo problema.