Skip to content

21. Conclusione

Abbiamo esplorato le basi del framework Struts 2 e presentato un'applicazione che combina diverse tecnologie. I lettori principianti e di livello intermedio troveranno in questo documento materiale utile per imparare e migliorare. È comunque necessario un libro di riferimento. Raccomando ancora una volta il libro:

"Struts 2 in Action" scritto da Donald Brown, Chad Michael Davis e Scott Stanlick, pubblicato da Manning.

Vorrei concludere evidenziando alcune problematiche che ho riscontrato durante la stesura degli esempi in questo documento. Ho già segnalato alcuni comportamenti inaspettati di Struts 2, in particolare durante l'inserimento di numeri e date. Ecco alcune altre problematiche che ho riscontrato:

Scarichiamo l'applicazione [pam-01] dal server Tomcat:

Image

La console di Apache visualizza quindi i seguenti log:

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

Lo scaricamento è andato a buon fine.

Scarichiamo [pam-02] allo stesso modo. I log sono 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]; 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

Righe 12, 14, 16: vengono segnalati errori gravi. Due di essi indicano una potenziale perdita di memoria. In effetti, l'applicazione [pam-02] presenta perdite di memoria. Dopo un po', l'applicazione diventa inutilizzabile. È quindi necessario chiudere NetBeans e ridistribuire l'applicazione.

Gli errori si riferiscono tutti ai thread. L'applicazione [pam-02] non utilizza thread di propria iniziativa. Dobbiamo quindi sospettare dei framework utilizzati: Struts 2, Spring 2.5 e Tiles. Possiamo ragionevolmente escludere Tiles, che probabilmente non gestisce i thread. Rimangono quindi Struts e Spring.

Conduciamo quindi un altro esperimento:

Implementiamo il livello [web] utilizzando il framework JSF al posto di Struts 2. Nient'altro cambia. Otteniamo quindi gli stessi messaggi di errore che avevamo con Struts 2.

Quindi il colpevole sembra essere Spring, il pool di connessioni dbcp qui utilizzato da Spring, o forse io stesso se non ho usato Spring correttamente. Potrei aver dimenticato una configurazione di Spring che avrebbe liberato i thread creati; potrei aver... La soluzione a questo problema di perdita di memoria rimane quindi da trovare.

Un altro esperimento. L'IDE NetBeans viene fornito in bundle con i server Tomcat e GlassFish. Proviamo a eseguire un'applicazione creata in questo documento su GlassFish:

  • in [2] le proprietà del progetto [example-08] [1]
  • in [3], la selezione del server web

Ecco la pagina visualizzata nel browser:

La portabilità prevista non è stata raggiunta. Ci sono due errori qui:

  • in [1], l'internazionalizzazione non ha funzionato
  • in [2], si verifica un'eccezione

Per la maggior parte delle applicazioni sviluppate in questo documento, si verificano questi stessi due errori. Non ho tentato di risolvere questo nuovo problema.